Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
40.07% covered (danger)
40.07%
890 / 2221
12.50% covered (danger)
12.50%
5 / 40
CRAP
0.00% covered (danger)
0.00%
0 / 1
AppController
39.99% covered (danger)
39.99%
887 / 2218
12.50% covered (danger)
12.50%
5 / 40
106891.48
0.00% covered (danger)
0.00%
0 / 1
 processSGF
98.11% covered (success)
98.11%
52 / 53
0.00% covered (danger)
0.00%
0 / 1
15
 xFlip
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 yFlip
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 getInitialPositionEnd
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 getInitialPosition
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
6
 getInvisibleSets
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
 getDeletedSets
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 startPageUpdate
88.89% covered (warning)
88.89%
16 / 18
0.00% covered (danger)
0.00%
0 / 1
5.03
 uotd
0.00% covered (danger)
0.00%
0 / 157
0.00% covered (danger)
0.00%
0 / 1
2070
 deleteUnusedStatuses
0.00% covered (danger)
0.00%
0 / 40
0.00% covered (danger)
0.00%
0 / 1
72
 saveSolvedNumber
78.12% covered (warning)
78.12%
25 / 32
0.00% covered (danger)
0.00%
0 / 1
13.51
 resetUserElos
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
 handleContribution
52.94% covered (warning)
52.94%
9 / 17
0.00% covered (danger)
0.00%
0 / 1
2.42
 getAllTags
96.55% covered (success)
96.55%
28 / 29
0.00% covered (danger)
0.00%
0 / 1
7
 getNewTsumego
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
12
 publishSingle
0.00% covered (danger)
0.00%
0 / 45
0.00% covered (danger)
0.00%
0 / 1
30
 getTsumegoOfTheDay
0.00% covered (danger)
0.00%
0 / 104
0.00% covered (danger)
0.00%
0 / 1
1190
 encrypt
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 decrypt
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 checkPictureLarge
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
12
 checkPicture
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
3.33
 saveDanSolveCondition
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
7
 updateSprintCondition
94.44% covered (success)
94.44%
17 / 18
0.00% covered (danger)
0.00%
0 / 1
4.00
 updateGoldenCondition
94.12% covered (success)
94.12%
16 / 17
0.00% covered (danger)
0.00%
0 / 1
3.00
 setPotionCondition
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
6
 updateGems
3.85% covered (danger)
3.85%
4 / 104
0.00% covered (danger)
0.00%
0 / 1
2183.48
 checkProblemNumberAchievements
42.39% covered (danger)
42.39%
39 / 92
0.00% covered (danger)
0.00%
0 / 1
166.38
 checkDanSolveAchievements
46.82% covered (danger)
46.82%
81 / 173
0.00% covered (danger)
0.00%
0 / 1
545.62
 checkForLocked
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
20
 checkNoErrorAchievements
50.77% covered (warning)
50.77%
33 / 65
0.00% covered (danger)
0.00%
0 / 1
51.48
 checkTimeModeAchievements
35.40% covered (danger)
35.40%
40 / 113
0.00% covered (danger)
0.00%
0 / 1
2273.83
 checkRatingAchievements
54.44% covered (warning)
54.44%
49 / 90
0.00% covered (danger)
0.00%
0 / 1
95.92
 checkLevelAchievements
72.22% covered (warning)
72.22%
65 / 90
0.00% covered (danger)
0.00%
0 / 1
42.63
 checkSetCompletedAchievements
19.72% covered (danger)
19.72%
14 / 71
0.00% covered (danger)
0.00%
0 / 1
166.54
 setAchievementSpecial
0.00% covered (danger)
0.00%
0 / 184
0.00% covered (danger)
0.00%
0 / 1
4160
 checkSetAchievements
18.10% covered (danger)
18.10%
40 / 221
0.00% covered (danger)
0.00%
0 / 1
2533.09
 updateXP
60.00% covered (warning)
60.00%
6 / 10
0.00% covered (danger)
0.00%
0 / 1
3.58
 handleSearchSettings
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
2
 signIn
83.33% covered (warning)
83.33%
5 / 6
0.00% covered (danger)
0.00%
0 / 1
2.02
 beforeFilter
85.40% covered (warning)
85.40%
275 / 322
0.00% covered (danger)
0.00%
0 / 1
78.14
 afterFilter
n/a
0 / 0
n/a
0 / 0
1
1<?php
2
3App::uses('Auth', 'Utility');
4App::uses('TsumegoFilters', 'Utility');
5App::uses('TimeMode', 'Utility');
6
7class AppController extends Controller {
8    public $viewClass = 'App';
9
10    public $components = [
11        'Session',
12        //'DebugKit.Toolbar',
13        'Flash',
14        'PlayResultProcessor'
15    ];
16
17    public static function processSGF($sgf) {
18        $aw = strpos($sgf, 'AW');
19        $ab = strpos($sgf, 'AB');
20        $boardSizePos = strpos($sgf, 'SZ');
21        $boardSize = 19;
22        $sgfArr = str_split($sgf);
23        if ($boardSizePos !== false) {
24            $boardSize = $sgfArr[$boardSizePos + 3] . '' . $sgfArr[$boardSizePos + 4];
25        }
26        if (substr($boardSize, 1) == ']') {
27            $boardSize = substr($boardSize, 0, 1);
28        }
29
30        $black = AppController::getInitialPosition($ab, $sgfArr, 'x');
31        $white = AppController::getInitialPosition($aw, $sgfArr, 'o');
32        $stones = array_merge($black, $white);
33
34        $board = [];
35        for ($i = 0; $i < 19; $i++) {
36            $board[$i] = [];
37            for ($j = 0; $j < 19; $j++) {
38                $board[$i][$j] = '-';
39            }
40        }
41        $lowestX = 18;
42        $lowestY = 18;
43        $highestX = 0;
44        $highestY = 0;
45        $stonesCount = count($stones);
46        for ($i = 0; $i < $stonesCount; $i++) {
47            if ($stones[$i][0] < $lowestX) {
48                $lowestX = $stones[$i][0];
49            }
50            if ($stones[$i][0] > $highestX) {
51                $highestX = $stones[$i][0];
52            }
53            if ($stones[$i][1] < $lowestY) {
54                $lowestY = $stones[$i][1];
55            }
56            if ($stones[$i][1] > $highestY) {
57                $highestY = $stones[$i][1];
58            }
59        }
60        if (18 - $lowestX < $lowestX) {
61            $stones = AppController::xFlip($stones);
62        }
63        if (18 - $lowestY < $lowestY) {
64            $stones = AppController::yFlip($stones);
65        }
66        $highestX = 0;
67        $highestY = 0;
68        $stonesCount = count($stones);
69        for ($i = 0; $i < $stonesCount; $i++) {
70            if ($stones[$i][0] > $highestX) {
71                $highestX = $stones[$i][0];
72            }
73            if ($stones[$i][1] > $highestY) {
74                $highestY = $stones[$i][1];
75            }
76            $board[$stones[$i][0]][$stones[$i][1]] = $stones[$i][2];
77        }
78        $tInfo = [];
79        $tInfo[0] = $highestX;
80        $tInfo[1] = $highestY;
81        $arr = [];
82        $arr[0] = $board;
83        $arr[1] = $stones;
84        $arr[2] = $tInfo;
85        $arr[3] = $boardSize;
86
87        return $arr;
88    }
89
90    public static function xFlip($stones) {
91        $stonesCount = count($stones);
92        for ($i = 0; $i < $stonesCount; $i++) {
93            $stones[$i][0] = 18 - $stones[$i][0];
94        }
95
96        return $stones;
97    }
98
99    public static function yFlip($stones) {
100        $stonesCount = count($stones);
101        for ($i = 0; $i < $stonesCount; $i++) {
102            $stones[$i][1] = 18 - $stones[$i][1];
103        }
104
105        return $stones;
106    }
107
108    public static function getInitialPositionEnd($pos, $sgfArr) {
109        $endCondition = 0;
110        $currentPos1 = $pos + 2;
111        $currentPos2 = $pos + 5;
112        while ($sgfArr[$currentPos1] == '[' && $sgfArr[$currentPos2] == ']') {
113            $endCondition = $currentPos2;
114            $currentPos1 += 4;
115            $currentPos2 += 4;
116        }
117
118        return $endCondition;
119    }
120
121    public static function getInitialPosition($pos, $sgfArr, $color) {
122        $arr = [];
123        $end = AppController::getInitialPositionEnd($pos, $sgfArr);
124        for ($i = $pos + 2; $i < $end; $i++) {
125            if ($sgfArr[$i] != '[' && $sgfArr[$i] != ']') {
126                array_push($arr, strtolower($sgfArr[$i]));
127            }
128        }
129        $alphabet = array_flip(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']);
130        $xy = true;
131        $arr2 = [];
132        $c = 0;
133        $arrCount = count($arr);
134        for ($i = 0; $i < $arrCount; $i++) {
135            $arr[$i] = $alphabet[$arr[$i]];
136            if ($xy) {
137                $arr2[$c] = [];
138                $arr2[$c][0] = $arr[$i];
139            } else {
140                $arr2[$c][1] = $arr[$i];
141                $arr2[$c][2] = $color;
142                $c++;
143            }
144            $xy = !$xy;
145        }
146
147        return $arr2;
148    }
149
150    protected function getInvisibleSets() {
151        $this->loadModel('Set');
152        $invisibleSets = [];
153        $in = $this->Set->find('all', ['conditions' => ['public' => 0]]);
154        if (!$in) {
155            $in = [];
156        }
157        foreach ($in as $item) {
158            $invisibleSets[] = $item['Set']['id'];
159        }
160
161        return $invisibleSets;
162    }
163
164    protected function getDeletedSets() {
165        $dSets = [];
166        $de = $this->Set->find('all', ['conditions' => ['public' => -1]]);
167        if (!$de) {
168            $de = [];
169        }
170        foreach ($de as $item) {
171            $dSets[] = $item['Set']['id'];
172        }
173
174        return $dSets;
175    }
176
177    /**
178     * @return void
179     */
180    public static function startPageUpdate() {
181        $str = '';
182        $latest = ClassRegistry::init('AchievementStatus')->find('all', ['limit' => 7, 'order' => 'created DESC']);
183        if (!$latest) {
184            $latest = [];
185        }
186        $latestCount = count($latest);
187        for ($i = 0; $i < $latestCount; $i++) {
188            $a = ClassRegistry::init('Achievement')->findById($latest[$i]['AchievementStatus']['achievement_id']);
189            $u = ClassRegistry::init('User')->findById($latest[$i]['AchievementStatus']['user_id']);
190            if (substr($u['User']['name'], 0, 3) == 'g__' && $u['User']['external_id'] != null) {
191                $startPageUser = AppController::checkPicture($u);
192            } else {
193                $startPageUser = $u['User']['name'];
194            }
195            $latest[$i]['AchievementStatus']['name'] = $a['Achievement']['name'];
196            $latest[$i]['AchievementStatus']['color'] = $a['Achievement']['color'];
197            $latest[$i]['AchievementStatus']['image'] = $a['Achievement']['image'];
198            $latest[$i]['AchievementStatus']['user'] = $startPageUser;
199            $str .= '<div class="quote1"><div class="quote1a"><a href="/achievements/view/' . $a['Achievement']['id'] . '"><img src="/img/' . $a['Achievement']['image'] . '.png" width="34px"></a></div>';
200            $str .= '<div class="quote1b">Achievement gained by ' . $startPageUser . ':<br><div class=""><b>' . $a['Achievement']['name'] . '</b></div></div></div>';
201        }
202        file_put_contents('mainPageAjax.txt', $str);
203    }
204
205    /**
206     * @return void
207     */
208    protected function uotd() { //routine1
209        $this->loadModel('User');
210        $this->loadModel('DayRecord');
211        $this->loadModel('TsumegoAttempt');
212        $this->loadModel('Achievement');
213        $this->loadModel('AchievementCondition');
214        $today = date('Y-m-d');
215        $ux2 = $this->User->find('all', [
216            'limit' => '8',
217            'order' => 'reuse3 DESC',
218            'conditions' => [
219                'NOT' => ['id' => [33]],
220            ],
221        ]);
222        if (!$ux2) {
223            $ux2 = [];
224        }
225        $last = $this->DayRecord->find('all', ['limit' => '7', 'order' => 'date DESC']);
226        if (!$last) {
227            $last = [];
228        }
229        $lastUotds = [];
230        $lastUsers = [];
231        foreach ($last as $item) {
232            $lastUotds[] = $item['DayRecord']['user_id'];
233        }
234        foreach ($ux2 as $item) {
235            $lastUsers[] = $item['User']['id'];
236        }
237        $resultUser = 72;
238        $lastUsersCount = count($lastUsers);
239        for ($i = 0; $i < $lastUsersCount; $i++) {
240            $foundUser = false;
241            $lastUotdsCount = count($lastUotds);
242            for ($j = 0; $j < $lastUotdsCount; $j++) {
243                if ($lastUsers[$i] == $lastUotds[$j]) {
244                    $foundUser = true;
245                }
246            }
247            if (!$foundUser) {
248                $resultUser = $lastUsers[$i];
249
250                break;
251            }
252        }
253        $ux = $this->User->findById($resultUser);
254
255        $recentlyUsed = [];
256        $d = 1;
257        while ($d <= 10) {
258            $ru = $this->DayRecord->find('first', ['conditions' => ['date' => date('Y-m-d', strtotime('-' . $d . ' days'))]]);
259            if ($ru) {
260                array_push($recentlyUsed, $ru);
261            }
262            $d++;
263        }
264        $currentQuote = 'q01';
265        $newQuote = 'q01';
266        $quoteChosen = false;
267        while (!$quoteChosen) {
268            $newQuote = rand(1, 45);
269            if ($newQuote < 10) {
270                $newQuote = 'q0' . $newQuote;
271            } else {
272                $newQuote = 'q' . $newQuote;
273            }
274
275            $f = false;
276            $recentlyUsedCount = count($recentlyUsed);
277            for ($i = 0; $i < $recentlyUsedCount; $i++) {
278                if ($newQuote == $recentlyUsed[$i]['DayRecord']['quote']) {
279                    $f = true;
280                }
281            }
282            if (!$f) {
283                $quoteChosen = true;
284            }
285        }
286        $currentQuote = $newQuote;
287        $dayUserRand = 1;
288        $uotdChosen = false;
289        while (!$uotdChosen) {
290            $dayUserRand = rand(1, 39);
291            $f = false;
292            $recentlyUsedCount = count($recentlyUsed);
293            for ($i = 0; $i < $recentlyUsedCount; $i++) {
294                if ($dayUserRand == $recentlyUsed[$i]['DayRecord']['userbg']) {
295                    $f = true;
296                }
297            }
298            if (!$f) {
299                $uotdChosen = true;
300            }
301        }
302        $activity = $this->TsumegoAttempt->find('all', ['limit' => 40000, 'conditions' => ['DATE(TsumegoAttempt.updated)' => date('Y-m-d', strtotime('yesterday'))]]);
303        if (!$activity) {
304            $activity = [];
305        }
306        $visitedProblems = count($activity);
307
308        //how many users today
309        $usersNum = [];
310        $activity = $this->User->find('all', ['limit' => 400, 'order' => 'created DESC']);
311        if (!$activity) {
312            $activity = [];
313        }
314        $activityCount = count($activity);
315        for ($i = 0; $i < $activityCount; $i++) {
316            $a = new DateTime($activity[$i]['User']['created']);
317            if ($a->format('Y-m-d') == $today) {
318                array_push($usersNum, $activity[$i]['User']);
319            }
320        }
321        $gemRand1 = rand(0, 2);
322        $gemRand2 = rand(0, 2);
323        $gemRand3 = rand(0, 2);
324
325        $arch1 = ClassRegistry::init('Achievement')->findById(111);
326        if ($gemRand1 == 0) {
327            $arch1['Achievement']['description'] = 'Has a chance to trigger once a day on an easy ddk problem.';
328        } elseif ($gemRand1 == 1) {
329            $arch1['Achievement']['description'] = 'Has a chance to trigger once a day on a regular ddk problem.';
330        } elseif ($gemRand1 == 2) {
331            $arch1['Achievement']['description'] = 'Has a chance to trigger once a day on a difficult ddk problem.';
332        }
333        ClassRegistry::init('Achievement')->save($arch1);
334        $arch2 = ClassRegistry::init('Achievement')->findById(112);
335        if ($gemRand2 == 0) {
336            $arch2['Achievement']['description'] = 'Has a chance to trigger once a day on an easy sdk problem.';
337        } elseif ($gemRand2 == 1) {
338            $arch2['Achievement']['description'] = 'Has a chance to trigger once a day on a regular sdk problem.';
339        } elseif ($gemRand2 == 2) {
340            $arch2['Achievement']['description'] = 'Has a chance to trigger once a day on a difficult sdk problem.';
341        }
342        ClassRegistry::init('Achievement')->save($arch2);
343        $arch3 = ClassRegistry::init('Achievement')->findById(113);
344        if ($gemRand3 == 0) {
345            $arch3['Achievement']['description'] = 'Has a chance to trigger once a day on an easy dan problem.';
346        } elseif ($gemRand3 == 1) {
347            $arch3['Achievement']['description'] = 'Has a chance to trigger once a day on a regular dan problem.';
348        } elseif ($gemRand3 == 2) {
349            $arch3['Achievement']['description'] = 'Has a chance to trigger once a day on a difficult dan problem.';
350        }
351        ClassRegistry::init('Achievement')->save($arch3);
352
353        $this->DayRecord->create();
354        $dateUser = [];
355        $dateUser['DayRecord']['user_id'] = $ux['User']['id'];
356        $dateUser['DayRecord']['date'] = $today;
357        $dateUser['DayRecord']['solved'] = $ux['User']['reuse3'];
358        $dateUser['DayRecord']['quote'] = $currentQuote;
359        $dateUser['DayRecord']['userbg'] = $dayUserRand;
360        $dateUser['DayRecord']['tsumego'] = $this->getTsumegoOfTheDay();
361        $dateUser['DayRecord']['newTsumego'] = $this->getNewTsumego();
362        $dateUser['DayRecord']['usercount'] = count($usersNum);
363        $dateUser['DayRecord']['visitedproblems'] = $visitedProblems;
364        $dateUser['DayRecord']['gems'] = $gemRand1 . '-' . $gemRand2 . '-' . $gemRand3;
365        $dateUser['DayRecord']['gemCounter1'] = 0;
366        $dateUser['DayRecord']['gemCounter2'] = 0;
367        $dateUser['DayRecord']['gemCounter3'] = 0;
368        $this->DayRecord->save($dateUser);
369
370        ClassRegistry::init('AchievementCondition')->create();
371        $achievementCondition = [];
372        $achievementCondition['AchievementCondition']['user_id'] = $ux['User']['id'];
373        $achievementCondition['AchievementCondition']['set_id'] = 0;
374        $achievementCondition['AchievementCondition']['category'] = 'uotd';
375        $achievementCondition['AchievementCondition']['value'] = 1;
376        ClassRegistry::init('AchievementCondition')->save($achievementCondition);
377
378        //delete duplicated DayRecords
379        $dr = $this->DayRecord->find('all');
380        if (!$dr) {
381            $dr = [];
382        }
383        $duplicates = [];
384        $drCount = count($dr);
385        for ($i = 0; $i < $drCount; $i++) {
386            $alreadyFound = [];
387            for ($j = 0; $j < $drCount; $j++) {
388                if ($i != $j && $dr[$j]['DayRecord']['date'] == $dr[$i]['DayRecord']['date']) {
389                    $found = false;
390                    $alreadyFoundCount = count($alreadyFound);
391                    for ($k = 0; $k < $alreadyFoundCount; $k++) {
392                        if ($alreadyFound[$k]['DayRecord']['id'] == $dr[$i]['DayRecord']['id'] || $alreadyFound[$k]['DayRecord']['id'] == $dr[$j]['DayRecord']['id']) {
393                            $found = true;
394                        }
395                    }
396                    if (!$found) {
397                        array_push($duplicates, $dr[$i]['DayRecord']['date']);
398                        array_push($alreadyFound, $dr[$i]);
399                    }
400                }
401            }
402        }
403        $duplicates = array_count_values($duplicates);
404        foreach ($duplicates as $key => $value) {
405            while ($duplicates[$key] > 1) {
406                $drd = $this->DayRecord->find('first', ['conditions' => ['date' => $key]]);
407                if ($drd) {
408                    $this->DayRecord->delete($drd['DayRecord']['id']);
409                }
410                $duplicates[$key]--;
411            }
412        }
413    }
414
415    public static function deleteUnusedStatuses(int $uid): void {
416        $s = ClassRegistry::init('Set')->find('all', [
417            'conditions' => [
418                'OR' => [
419                    ['public' => 1],
420                    ['public' => 0],
421                ],
422            ],
423        ]) ?: [];
424        $ids = [];
425        $sCount = count($s);
426        for ($i = 0; $i < $sCount; $i++) {
427            $tSet = TsumegoUtil::collectTsumegosFromSet($s[$i]['Set']['id']);
428            foreach ($tSet as $item) {
429                $ids[] = $item['Tsumego']['id'];
430            }
431        }
432        $ut = ClassRegistry::init('TsumegoStatus')->find('all', [
433            'conditions' => [
434                'user_id' => $uid,
435                'NOT' => [
436                    'tsumego_id' => $ids,
437                ],
438            ],
439        ]);
440        if (!$ut) {
441            $ut = [];
442        }
443        $utCount = count($ut);
444        for ($i = 0; $i < $utCount; $i++) {
445            $test1 = ClassRegistry::init('Tsumego')->findById($ut[$i]['TsumegoStatus']['tsumego_id']);
446            $test2 = ClassRegistry::init('SetConnection')->find('first', ['conditions' => ['tsumego_id' => $test1['Tsumego']['id']]]);
447            if (!$test2) {
448                ClassRegistry::init('TsumegoStatus')->delete($ut[$i]['TsumegoStatus']['id']);
449
450                continue;
451            }
452            $test3 = ClassRegistry::init('Set')->find('first', [
453                'id' => $test2['SetConnection']['set_id'],
454                'OR' => [
455                    ['public' => 1],
456                    ['public' => 0],
457                ],
458            ]);
459            if ($test3 == null) {
460                ClassRegistry::init('TsumegoStatus')->delete($ut[$i]['TsumegoStatus']['id']);
461            }
462        }
463    }
464
465    protected function saveSolvedNumber($uid) {
466        $this->loadModel('User');
467        $this->loadModel('TsumegoStatus');
468        $this->loadModel('Set');
469        $this->loadModel('SetConnection');
470
471        $solvedUts2 = 0;
472        $tsumegos = $this->SetConnection->find('all');
473        if (!$tsumegos) {
474            $tsumegos = [];
475        }
476        $uts = $this->TsumegoStatus->find('all', ['order' => 'updated DESC', 'conditions' => ['user_id' => $uid]]);
477        if (!$uts) {
478            $uts = [];
479        }
480        $setKeys = [];
481        $setArray = $this->Set->find('all', ['conditions' => ['public' => 1]]);
482        if (!$setArray) {
483            $setArray = [];
484        }
485
486        $setArrayCount = count($setArray);
487        for ($i = 0; $i < $setArrayCount; $i++) {
488            $setKeys[$setArray[$i]['Set']['id']] = $setArray[$i]['Set']['id'];
489        }
490
491        $scs = [];
492        $tsumegosCount = count($tsumegos);
493        for ($j = 0; $j < $tsumegosCount; $j++) {
494            if (!isset($scs[$tsumegos[$j]['SetConnection']['tsumego_id']])) {
495                $scs[$tsumegos[$j]['SetConnection']['tsumego_id']] = 1;
496            } else {
497                $scs[$tsumegos[$j]['SetConnection']['tsumego_id']]++;
498            }
499        }
500        $utsCount = count($uts);
501        for ($j = 0; $j < $utsCount; $j++) {
502            if ($uts[$j]['TsumegoStatus']['status'] == 'S' || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C') {
503                if (isset($scs[$uts[$j]['TsumegoStatus']['tsumego_id']])) {
504                    $solvedUts2 += $scs[$uts[$j]['TsumegoStatus']['tsumego_id']];
505                }
506            }
507        }
508        Auth::getUser()['solved'] = $solvedUts2;
509        Auth::saveUser();
510
511        return $solvedUts2;
512    }
513
514    /**
515     * @return void
516     */
517    protected function resetUserElos() {
518        $this->loadModel('User');
519
520        $u = $this->User->find('all', [
521            'conditions' => [
522                'id >=' => 15000,
523                'id <=' => 19000,
524            ],
525        ]);
526        if (!$u) {
527            $u = [];
528        }
529
530        $uCount = count($u);
531        for ($i = 0; $i < $uCount; $i++) {
532            $u[$i]['User']['rating'] = 900;
533            $u[$i]['User']['solved2'] = 0;
534            $this->User->save($u[$i]);
535        }
536    }
537
538    /**
539     * @param int $uid User ID
540     * @param string $action Action type
541     *
542     * @return void
543     */
544    public static function handleContribution($uid, $action) {
545        $uc = ClassRegistry::init('UserContribution')->find('first', ['conditions' => ['user_id' => $uid]]);
546        if ($uc == null) {
547            $uc = [];
548            $uc['UserContribution']['user_id'] = $uid;
549            $uc['UserContribution']['added_tag'] = 0;
550            $uc['UserContribution']['created_tag'] = 0;
551            $uc['UserContribution']['made_proposal'] = 0;
552            $uc['UserContribution']['reviewed'] = 0;
553            $uc['UserContribution']['score'] = 0;
554            ClassRegistry::init('UserContribution')->create();
555        }
556        $uc['UserContribution'][$action] += 1;
557        $uc['UserContribution']['score']
558        = $uc['UserContribution']['added_tag']
559        + $uc['UserContribution']['created_tag'] * 3
560        + $uc['UserContribution']['made_proposal'] * 5
561        + $uc['UserContribution']['reviewed'] * 2;
562        ClassRegistry::init('UserContribution')->save($uc);
563    }
564
565    public static function getAllTags($not) {
566        $a = [];
567        $notApproved = ClassRegistry::init('TagName')->find('all', ['conditions' => ['approved' => 0]]);
568        if (!$notApproved) {
569            $notApproved = [];
570        }
571        $notCount = count($not);
572        for ($i = 0; $i < $notCount; $i++) {
573            array_push($a, $not[$i]['Tag']['tag_name_id']);
574        }
575        $notApprovedCount = count($notApproved);
576        for ($i = 0; $i < $notApprovedCount; $i++) {
577            array_push($a, $notApproved[$i]['TagName']['id']);
578        }
579        $tn = ClassRegistry::init('TagName')->find('all', [
580            'conditions' => [
581                'NOT' => ['id' => $a],
582            ],
583        ]);
584        if (!$tn) {
585            $tn = [];
586        }
587        $sorted = [];
588        $keys = [];
589        $tnCount = count($tn);
590        for ($i = 0; $i < $tnCount; $i++) {
591            array_push($sorted, $tn[$i]['TagName']['name']);
592            $keys[$tn[$i]['TagName']['name']] = $tn[$i];
593        }
594        sort($sorted);
595        $s2 = [];
596        $sortedCount = count($sorted);
597        for ($i = 0; $i < $sortedCount; $i++) {
598            array_push($s2, $keys[$sorted[$i]]);
599        }
600
601        return $s2;
602    }
603
604    protected function getNewTsumego() {
605        $this->loadModel('Schedule');
606        $date = date('Y-m-d', strtotime('today'));
607        $s = $this->Schedule->find('all', ['conditions' => ['date' => $date]]);
608        if (!$s) {
609            $s = [];
610        }
611        $id = 0;
612        $sCount = count($s);
613        for ($i = 0; $i < $sCount; $i++) {
614            $id = $this->publishSingle($s[$i]['Schedule']['tsumego_id'], $s[$i]['Schedule']['set_id'], $s[$i]['Schedule']['date']);
615            $s[$i]['Schedule']['tsumego_id'] = $id;
616            $s[$i]['Schedule']['published'] = 1;
617            $this->Schedule->save($s[$i]);
618        }
619
620        return $id;
621    }
622
623    protected function publishSingle($t = null, $to = null, $date = null) {
624        $this->loadModel('Tsumego');
625        $this->loadModel('Sgf');
626        $this->loadModel('SetConnection');
627        $this->loadModel('PublishDate');
628        $ts = $this->Tsumego->findById($t);
629
630        $id = $this->Tsumego->find('first', ['limit' => 1, 'order' => 'id DESC']);
631        if (!$id) {
632            return null;
633        }
634        $id = $id['Tsumego']['id'];
635        $id += 1;
636
637        $scT = $this->SetConnection->find('first', ['conditions' => ['tsumego_id' => $ts['Tsumego']['id']]]);
638        if ($scT != null) {
639            $scT['SetConnection']['set_id'] = $to;
640            $scT['SetConnection']['tsumego_id'] = $id;
641            $scT['SetConnection']['num'] = $ts['Tsumego']['num'];
642            $this->SetConnection->save($scT);
643        } else {
644            $scT = [];
645            $scT['SetConnection']['set_id'] = $to;
646            $scT['SetConnection']['tsumego_id'] = $id;
647            $scT['SetConnection']['num'] = $ts['Tsumego']['num'];
648            $this->SetConnection->create();
649            $this->SetConnection->save($scT);
650        }
651
652        $sid = $ts['Tsumego']['id'];
653        $ts['Tsumego']['id'] = $id;
654        $ts['Tsumego']['created'] = $date . ' 22:00:00';
655        $ts['Tsumego']['solved'] = 0;
656        $ts['Tsumego']['failed'] = 0;
657        $ts['Tsumego']['userWin'] = 0;
658        $ts['Tsumego']['userLoss'] = 0;
659        $this->Tsumego->create();
660        $this->Tsumego->save($ts);
661        $this->Tsumego->delete($sid);
662
663        $sgfs = $this->Sgf->find('all', ['conditions' => ['tsumego_id' => $t]]);
664        if (!$sgfs) {
665            $sgfs = [];
666        }
667        $sgfsCount = count($sgfs);
668        for ($i = 0; $i < $sgfsCount; $i++) {
669            $sgfs[$i]['Sgf']['tsumego_id'] = $id;
670            $this->Sgf->save($sgfs[$i]);
671        }
672        $x = [];
673        $x['PublishDate']['date'] = $date . ' 22:00:00';
674        $x['PublishDate']['tsumego_id'] = $id;
675        $this->PublishDate->create();
676        $this->PublishDate->save($x);
677
678        return $id;
679    }
680
681    protected function getTsumegoOfTheDay() {
682        $this->loadModel('TsumegoAttempt');
683        $this->loadModel('TsumegoRatingAttempt');
684        $this->loadModel('Schedule');
685        $this->loadModel('Tsumego');
686        $this->loadModel('SetConnection');
687
688        $ut = $this->TsumegoRatingAttempt->find('all', ['limit' => 10000, 'order' => 'created DESC', 'conditions' => ['status' => 'S']]);
689        if (!$ut) {
690            $ut = [];
691        }
692        $out = $this->TsumegoAttempt->find('all', ['limit' => 30000, 'order' => 'updated DESC', 'conditions' => ['gain >=' => 40]]);
693        if (!$out) {
694            $out = [];
695        }
696
697        $date = date('Y-m-d', strtotime('yesterday'));
698        $s = $this->Schedule->find('all', ['conditions' => ['date' => $date]]);
699        if (!$s) {
700            $s = [];
701        }
702        $ids = [];
703        $utCount = count($ut);
704        for ($i = 0; $i < $utCount; $i++) {
705            $date2 = new DateTime($ut[$i]['TsumegoRatingAttempt']['created']);
706            $date2 = $date2->format('Y-m-d');
707            if ($date === $date2) {
708                array_push($ids, $ut[$i]['TsumegoRatingAttempt']['tsumego_id']);
709            }
710        }
711        $ids = array_count_values($ids);
712        $highest = 0;
713        $best = [];
714        foreach ($ids as $key => $value) {
715            if ($value > $highest) {
716                $highest = $value;
717            }
718        }
719        foreach ($ids as $key => $value) {
720            if ($value == $highest) {
721                $x = [];
722                $x[$key] = $value;
723                array_push($best, $x);
724            }
725        }
726        $ids2 = [];
727        $out2 = [];
728        $outCount = count($out);
729        for ($i = 0; $i < $outCount; $i++) {
730            $date2 = new DateTime($out[$i]['TsumegoAttempt']['updated']);
731            $date2 = $date2->format('Y-m-d');
732            if ($date === $date2) {
733                array_push($ids2, $out[$i]['TsumegoAttempt']['tsumego_id']);
734                array_push($out2, $out[$i]);
735            }
736        }
737        $ids2 = array_count_values($ids2);
738        $highest = 0;
739        $best2 = [];
740        foreach ($ids2 as $key => $value) {
741            if ($value > $highest) {
742                $highest = $value;
743            }
744        }
745        $done = false;
746        $found = 0;
747        $decrement = 0;
748        $best3 = [];
749        $findNum = 20;
750        while (!$done) {
751            foreach ($ids2 as $key => $value) {
752                if ($value == $highest - $decrement) {
753                    array_push($best2, $key);
754                    array_push($best3, $value);
755                    $found++;
756                }
757            }
758            $decrement++;
759            if ($found < $findNum) {
760                $done = false;
761            } else {
762                $done = true;
763            }
764        }
765        $newBest = [];
766        for ($j = 0; $j < $findNum; $j++) {
767            $newBest[$j] = [];
768        }
769        $out2Count = count($out2);
770        for ($i = 0; $i < $out2Count; $i++) {
771            for ($j = 0; $j < $findNum; $j++) {
772                if ($out2[$i]['TsumegoAttempt']['tsumego_id'] == $best2[$j]) {
773                    $x = [];
774                    $x['tid'] = $out2[$i]['TsumegoAttempt']['tsumego_id'];
775                    $tx = $this->Tsumego->findById($x['tid']);
776                    $scT = $this->SetConnection->find('first', ['conditions' => ['tsumego_id' => $tx['Tsumego']['id']]]);
777                    $tx['Tsumego']['set_id'] = $scT['SetConnection']['set_id'];
778                    $x['sid'] = $tx['Tsumego']['set_id'];
779                    $x['status'] = $out2[$i]['TsumegoAttempt']['solved'];
780                    $x['seconds'] = $out2[$i]['TsumegoAttempt']['seconds'];
781
782                    $newBest[$j][] = $x;
783                }
784            }
785        }
786        $newBestCount = count($newBest);
787        for ($i = 0; $i < $newBestCount; $i++) {
788            $sum = 0;
789            $newBestICount = count($newBest[$i]);
790            for ($j = 0; $j < $newBestICount; $j++) {
791                if ($newBest[$i][$j]['seconds'] != null) {
792                    if ($newBest[$i][$j]['seconds'] > 300) {
793                        $newBest[$i][$j]['seconds'] = 300;
794                    }
795                    $sum += $newBest[$i][$j]['seconds'];
796                }
797            }
798            $sum = $sum * count($newBest[$i]);
799            $newBest[$i]['sum'] = $sum;
800        }
801        $highest = 0;
802        $hid = 0;
803        $newBestCount = count($newBest);
804        for ($i = 0; $i < $newBestCount; $i++) {
805            if ($newBest[$i]['sum'] > $highest && $newBest[$i][0]['sid'] != 104 && $newBest[$i][0]['sid'] != 105 && $newBest[$i][0]['sid'] != 117) {
806                $yesterday = false;
807                $sCount = count($s);
808                for ($j = 0; $j < $sCount; $j++) {
809                    if ($newBest[$i][0]['tid'] == $s[$j]['Schedule']['tsumego_id']) {
810                        $yesterday = true;
811                    }
812                }
813                if (!$yesterday) {
814                    $highest = $newBest[$i]['sum'];
815                    $hid = $i;
816                }
817            }
818        }
819
820        return $newBest[$hid][0]['tid'];
821    }
822
823    public static function encrypt($str = null) {
824        $secret_key = 'my_simple_secret_keyx';
825        $secret_iv = 'my_simple_secret_ivx';
826        $encrypt_method = 'AES-256-CBC';
827        $key = hash('sha256', $secret_key);
828        $iv = substr(hash('sha256', $secret_iv), 0, 16);
829
830        return base64_encode(openssl_encrypt($str, $encrypt_method, $key, 0, $iv));
831    }
832
833    public static function decrypt($str = null) {
834        $string = $str;
835        $secret_key = 'my_simple_secret_keyx';
836        $secret_iv = 'my_simple_secret_ivx';
837        $encrypt_method = 'AES-256-CBC';
838        $key = hash('sha256', $secret_key);
839        $iv = substr(hash('sha256', $secret_iv), 0, 16);
840
841        return openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
842    }
843
844    protected function checkPictureLarge($u) {
845        if (substr($u['User']['name'], 0, 3) == 'g__' && $u['User']['external_id'] != null) {
846            return '<img class="google-profile-image-large" src="/img/google/' . $u['User']['picture'] . '">' . substr($u['User']['name'], 3);
847        }
848
849        return $u['User']['name'];
850    }
851    public static function checkPicture($user) {
852        if (substr($user['name'], 0, 3) == 'g__' && $user['external_id'] != null) {
853            return '<img class="google-profile-image" src="/img/google/' . $user['picture'] . '">' . substr($user['name'], 3);
854        }
855
856        return $user['name'];
857    }
858
859    public static function saveDanSolveCondition($solvedTsumegoRank, $tId): void {
860        if ($solvedTsumegoRank == '1d' || $solvedTsumegoRank == '2d' || $solvedTsumegoRank == '3d' || $solvedTsumegoRank == '4d' || $solvedTsumegoRank == '5d') {
861            $danSolveCategory = 'danSolve' . $solvedTsumegoRank;
862            $danSolveCondition = ClassRegistry::init('AchievementCondition')->find('first', [
863                'order' => 'value DESC',
864                'conditions' => [
865                    'user_id' => Auth::getUserID(),
866                    'category' => $danSolveCategory,
867                ],
868            ]);
869            if (!$danSolveCondition) {
870                $danSolveCondition = [];
871                $danSolveCondition['AchievementCondition']['value'] = 0;
872                ClassRegistry::init('AchievementCondition')->create();
873            }
874            $danSolveCondition['AchievementCondition']['category'] = $danSolveCategory;
875            $danSolveCondition['AchievementCondition']['user_id'] = Auth::getUserID();
876            $danSolveCondition['AchievementCondition']['set_id'] = $tId;
877            $danSolveCondition['AchievementCondition']['value']++;
878
879            ClassRegistry::init('AchievementCondition')->save($danSolveCondition);
880        }
881    }
882
883    public static function updateSprintCondition(bool $trigger = false): void {
884        if (Auth::isLoggedIn()) {
885            $sprintCondition = ClassRegistry::init('AchievementCondition')->find('first', [
886                'order' => 'value DESC',
887                'conditions' => [
888                    'user_id' => Auth::getUserID(),
889                    'category' => 'sprint',
890                ],
891            ]);
892            if (!$sprintCondition) {
893                $sprintCondition = [];
894                $sprintCondition['AchievementCondition']['value'] = 0;
895                ClassRegistry::init('AchievementCondition')->create();
896            }
897            $sprintCondition['AchievementCondition']['category'] = 'sprint';
898            $sprintCondition['AchievementCondition']['user_id'] = Auth::getUserID();
899            if ($trigger) {
900                $sprintCondition['AchievementCondition']['value']++;
901            } else {
902                $sprintCondition['AchievementCondition']['value'] = 0;
903            }
904            ClassRegistry::init('AchievementCondition')->save($sprintCondition);
905        }
906    }
907
908    public static function updateGoldenCondition(bool $trigger = false): void {
909        $goldenCondition = ClassRegistry::init('AchievementCondition')->find('first', [
910            'order' => 'value DESC',
911            'conditions' => [
912                'user_id' => Auth::getUserID(),
913                'category' => 'golden',
914            ],
915        ]);
916        if (!$goldenCondition) {
917            $goldenCondition = [];
918            $goldenCondition['AchievementCondition']['value'] = 0;
919            ClassRegistry::init('AchievementCondition')->create();
920        }
921        $goldenCondition['AchievementCondition']['category'] = 'golden';
922        $goldenCondition['AchievementCondition']['user_id'] = Auth::getUserID();
923        if ($trigger) {
924            $goldenCondition['AchievementCondition']['value']++;
925        } else {
926            $goldenCondition['AchievementCondition']['value'] = 0;
927        }
928        ClassRegistry::init('AchievementCondition')->save($goldenCondition);
929    }
930
931    public static function setPotionCondition(): void {
932        $potionCondition = ClassRegistry::init('AchievementCondition')->find('first', [
933            'order' => 'value DESC',
934            'conditions' => [
935                'user_id' => Auth::getUserID(),
936                'category' => 'potion',
937            ],
938        ]);
939        if (!$potionCondition) {
940            $potionCondition = [];
941            ClassRegistry::init('AchievementCondition')->create();
942        }
943        $potionCondition['AchievementCondition']['category'] = 'potion';
944        $potionCondition['AchievementCondition']['user_id'] = Auth::getUserID();
945        $potionCondition['AchievementCondition']['value'] = 1;
946        ClassRegistry::init('AchievementCondition')->save($potionCondition);
947    }
948
949    public static function updateGems(string $rank): void {
950        $datex = new DateTime('today');
951        $dateGem = ClassRegistry::init('DayRecord')->find('first', ['conditions' => ['date' => $datex->format('Y-m-d')]]);
952        if ($dateGem != null) {
953            $gems = explode('-', $dateGem['DayRecord']['gems']);
954            $gemValue = '';
955            $gemValue2 = '';
956            $gemValue3 = '';
957            $condition1 = 500;
958            $condition2 = 200;
959            $condition3 = 5;
960            $found1 = false;
961            $found2 = false;
962            $found3 = false;
963            if ($rank == '15k' || $rank == '14k' || $rank == '13k' || $rank == '12k' || $rank == '11k' || $rank == '10k') {
964                if ($gems[0] == 0) {
965                    $gemValue = '15k';
966                } elseif ($gems[0] == 1) {
967                    $gemValue = '12k';
968                } elseif ($gems[0] == 2) {
969                    $gemValue = '10k';
970                }
971                if ($rank == $gemValue) {
972                    $dateGem['DayRecord']['gemCounter1']++;
973                    if ($dateGem['DayRecord']['gemCounter1'] == $condition1) {
974                        $found1 = true;
975                    }
976                }
977            } elseif ($rank == '9k' || $rank == '8k' || $rank == '7k' || $rank == '6k' || $rank == '5k' || $rank == '4k' || $rank == '3k' || $rank == '2k' || $rank == '1k') {
978                if ($gems[1] == 0) {
979                    $gemValue = '9k';
980                    $gemValue2 = 'x';
981                    $gemValue3 = 'y';
982                } elseif ($gems[1] == 1) {
983                    $gemValue = '6k';
984                    $gemValue2 = '5k';
985                    $gemValue3 = '4k';
986                } elseif ($gems[1] == 2) {
987                    $gemValue = 'x';
988                    $gemValue2 = '2k';
989                    $gemValue3 = '1k';
990                }
991                if ($rank == $gemValue || $rank == $gemValue2 || $rank == $gemValue3) {
992                    $dateGem['DayRecord']['gemCounter2']++;
993                    if ($dateGem['DayRecord']['gemCounter2'] == $condition2) {
994                        $found2 = true;
995                    }
996                }
997            } elseif ($rank == '1d' || $rank == '2d' || $rank == '3d' || $rank == '4d' || $rank == '5d' || $rank == '6d' || $rank == '7d') {
998                if ($gems[2] == 0) {
999                    $gemValue = '1d';
1000                    $gemValue2 = '2d';
1001                    $gemValue3 = '3d';
1002                } elseif ($gems[2] == 1) {
1003                    $gemValue = '2d';
1004                    $gemValue2 = '3d';
1005                    $gemValue3 = '4d';
1006                } elseif ($gems[2] == 2) {
1007                    $gemValue = '5d';
1008                    $gemValue2 = '6d';
1009                    $gemValue3 = '7d';
1010                }
1011                if ($rank == $gemValue || $rank == $gemValue2 || $rank == $gemValue3) {
1012                    $dateGem['DayRecord']['gemCounter3']++;
1013                    if ($dateGem['DayRecord']['gemCounter3'] == $condition3) {
1014                        $found3 = true;
1015                    }
1016                }
1017            }
1018            if ($found1) {
1019                $aCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1020                    'order' => 'value DESC',
1021                    'conditions' => [
1022                        'user_id' => Auth::getUserID(),
1023                        'category' => 'emerald',
1024                    ],
1025                ]);
1026                if ($aCondition == null) {
1027                    $aCondition = [];
1028                    $aCondition['AchievementCondition']['category'] = 'emerald';
1029                    $aCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1030                    $aCondition['AchievementCondition']['value'] = 1;
1031                    ClassRegistry::init('AchievementCondition')->save($aCondition);
1032                } else {
1033                    $dateGem['DayRecord']['gemCounter1']--;
1034                }
1035            } elseif ($found2) {
1036                $aCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1037                    'order' => 'value DESC',
1038                    'conditions' => [
1039                        'user_id' => Auth::getUserID(),
1040                        'category' => 'sapphire',
1041                    ],
1042                ]);
1043                if ($aCondition == null) {
1044                    $aCondition = [];
1045                    $aCondition['AchievementCondition']['category'] = 'sapphire';
1046                    $aCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1047                    $aCondition['AchievementCondition']['value'] = 1;
1048                    ClassRegistry::init('AchievementCondition')->save($aCondition);
1049                } else {
1050                    $dateGem['DayRecord']['gemCounter2']--;
1051                }
1052            } elseif ($found3) {
1053                $aCondition = ClassRegistry::init('AchievementCondition')->find('first', [
1054                    'order' => 'value DESC',
1055                    'conditions' => [
1056                        'user_id' => Auth::getUserID(),
1057                        'category' => 'ruby',
1058                    ],
1059                ]);
1060                if ($aCondition == null) {
1061                    $aCondition = [];
1062                    $aCondition['AchievementCondition']['category'] = 'ruby';
1063                    $aCondition['AchievementCondition']['user_id'] = Auth::getUserID();
1064                    $aCondition['AchievementCondition']['value'] = 1;
1065                    ClassRegistry::init('AchievementCondition')->save($aCondition);
1066                } else {
1067                    $dateGem['DayRecord']['gemCounter3']--;
1068                }
1069            }
1070        }
1071        ClassRegistry::init('DayRecord')->save($dateGem);
1072    }
1073
1074    public static function checkProblemNumberAchievements() {
1075        if (!Auth::isLoggedIn()) {
1076            return;
1077        }
1078
1079        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1080        if (!$buffer) {
1081            $buffer = [];
1082        }
1083        $existingAs = [];
1084        $bufferCount = count($buffer);
1085        for ($i = 0; $i < $bufferCount; $i++) {
1086            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1087        }
1088        $as = [];
1089        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1090        $updated = [];
1091
1092        $achievementId = 1;
1093        $solvedCount = Auth::getUser()['solved'];
1094        if ($solvedCount >= 1000 && !isset($existingAs[$achievementId])) {
1095            $as['AchievementStatus']['achievement_id'] = $achievementId;
1096            ClassRegistry::init('AchievementStatus')->create();
1097            ClassRegistry::init('AchievementStatus')->save($as);
1098            array_push($updated, $achievementId);
1099        }
1100        $achievementId = 2;
1101        if ($solvedCount >= 2000 && !isset($existingAs[$achievementId])) {
1102            $as['AchievementStatus']['achievement_id'] = $achievementId;
1103            ClassRegistry::init('AchievementStatus')->create();
1104            ClassRegistry::init('AchievementStatus')->save($as);
1105            array_push($updated, $achievementId);
1106        }
1107        $achievementId = 3;
1108        if ($solvedCount >= 3000 && !isset($existingAs[$achievementId])) {
1109            $as['AchievementStatus']['achievement_id'] = $achievementId;
1110            ClassRegistry::init('AchievementStatus')->create();
1111            ClassRegistry::init('AchievementStatus')->save($as);
1112            array_push($updated, $achievementId);
1113        }
1114        $achievementId = 4;
1115        if ($solvedCount >= 4000 && !isset($existingAs[$achievementId])) {
1116            $as['AchievementStatus']['achievement_id'] = $achievementId;
1117            ClassRegistry::init('AchievementStatus')->create();
1118            ClassRegistry::init('AchievementStatus')->save($as);
1119            array_push($updated, $achievementId);
1120        }
1121        $achievementId = 5;
1122        if ($solvedCount >= 5000 && !isset($existingAs[$achievementId])) {
1123            $as['AchievementStatus']['achievement_id'] = $achievementId;
1124            ClassRegistry::init('AchievementStatus')->create();
1125            ClassRegistry::init('AchievementStatus')->save($as);
1126            array_push($updated, $achievementId);
1127        }
1128        $achievementId = 6;
1129        if ($solvedCount >= 6000 && !isset($existingAs[$achievementId])) {
1130            $as['AchievementStatus']['achievement_id'] = $achievementId;
1131            ClassRegistry::init('AchievementStatus')->create();
1132            ClassRegistry::init('AchievementStatus')->save($as);
1133            array_push($updated, $achievementId);
1134        }
1135        $achievementId = 7;
1136        if ($solvedCount >= 7000 && !isset($existingAs[$achievementId])) {
1137            $as['AchievementStatus']['achievement_id'] = $achievementId;
1138            ClassRegistry::init('AchievementStatus')->create();
1139            ClassRegistry::init('AchievementStatus')->save($as);
1140            array_push($updated, $achievementId);
1141        }
1142        $achievementId = 8;
1143        if ($solvedCount >= 8000 && !isset($existingAs[$achievementId])) {
1144            $as['AchievementStatus']['achievement_id'] = $achievementId;
1145            ClassRegistry::init('AchievementStatus')->create();
1146            ClassRegistry::init('AchievementStatus')->save($as);
1147            array_push($updated, $achievementId);
1148        }
1149        $achievementId = 9;
1150        if ($solvedCount >= 9000 && !isset($existingAs[$achievementId])) {
1151            $as['AchievementStatus']['achievement_id'] = $achievementId;
1152            ClassRegistry::init('AchievementStatus')->create();
1153            ClassRegistry::init('AchievementStatus')->save($as);
1154            array_push($updated, $achievementId);
1155        }
1156        $achievementId = 10;
1157        if ($solvedCount >= 10000 && !isset($existingAs[$achievementId])) {
1158            $as['AchievementStatus']['achievement_id'] = $achievementId;
1159            ClassRegistry::init('AchievementStatus')->create();
1160            ClassRegistry::init('AchievementStatus')->save($as);
1161            array_push($updated, $achievementId);
1162        }
1163        //uotd achievement
1164        $achievementId = 11;
1165        if (!isset($existingAs[$achievementId])) {
1166            $condition = ClassRegistry::init('AchievementCondition')->find('first', ['conditions' => ['user_id' => Auth::getUserID(), 'category' => 'uotd']]);
1167            if ($condition != null) {
1168                $as['AchievementStatus']['achievement_id'] = $achievementId;
1169                ClassRegistry::init('AchievementStatus')->create();
1170                ClassRegistry::init('AchievementStatus')->save($as);
1171                array_push($updated, $achievementId);
1172            }
1173        }
1174
1175        $updatedCount = count($updated);
1176        for ($i = 0; $i < $updatedCount; $i++) {
1177            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1178            $updated[$i] = [];
1179            $updated[$i][0] = $a['Achievement']['name'];
1180            $updated[$i][1] = $a['Achievement']['description'];
1181            $updated[$i][2] = $a['Achievement']['image'];
1182            $updated[$i][3] = $a['Achievement']['color'];
1183            $updated[$i][4] = $a['Achievement']['xp'];
1184            $updated[$i][5] = $a['Achievement']['id'];
1185        }
1186
1187        return $updated;
1188    }
1189
1190    public static function checkDanSolveAchievements() {
1191        if (Auth::isLoggedIn()) {
1192            $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1193            if (!$buffer) {
1194                $buffer = [];
1195            }
1196            $ac = ClassRegistry::init('AchievementCondition')->find('all', [
1197                'order' => 'category ASC',
1198                'conditions' => [
1199                    'user_id' => Auth::getUserID(),
1200                    'OR' => [
1201                        ['category' => 'danSolve1d'],
1202                        ['category' => 'danSolve2d'],
1203                        ['category' => 'danSolve3d'],
1204                        ['category' => 'danSolve4d'],
1205                        ['category' => 'danSolve5d'],
1206                        ['category' => 'emerald'],
1207                        ['category' => 'sapphire'],
1208                        ['category' => 'ruby'],
1209                        ['category' => 'sprint'],
1210                        ['category' => 'golden'],
1211                        ['category' => 'potion'],
1212                    ],
1213                ],
1214            ]);
1215            if (!$ac) {
1216                $ac = [];
1217            }
1218            $ac1 = [];
1219            $acCount = count($ac);
1220            for ($i = 0; $i < $acCount; $i++) {
1221                if ($ac[$i]['AchievementCondition']['category'] == 'danSolve1d') {
1222                    $ac1['1d'] = $ac[$i]['AchievementCondition']['value'];
1223                } elseif ($ac[$i]['AchievementCondition']['category'] == 'danSolve2d') {
1224                    $ac1['2d'] = $ac[$i]['AchievementCondition']['value'];
1225                } elseif ($ac[$i]['AchievementCondition']['category'] == 'danSolve3d') {
1226                    $ac1['3d'] = $ac[$i]['AchievementCondition']['value'];
1227                } elseif ($ac[$i]['AchievementCondition']['category'] == 'danSolve4d') {
1228                    $ac1['4d'] = $ac[$i]['AchievementCondition']['value'];
1229                } elseif ($ac[$i]['AchievementCondition']['category'] == 'danSolve5d') {
1230                    $ac1['5d'] = $ac[$i]['AchievementCondition']['value'];
1231                } elseif ($ac[$i]['AchievementCondition']['category'] == 'emerald') {
1232                    $ac1['emerald'] = $ac[$i]['AchievementCondition']['value'];
1233                } elseif ($ac[$i]['AchievementCondition']['category'] == 'sapphire') {
1234                    $ac1['sapphire'] = $ac[$i]['AchievementCondition']['value'];
1235                } elseif ($ac[$i]['AchievementCondition']['category'] == 'ruby') {
1236                    $ac1['ruby'] = $ac[$i]['AchievementCondition']['value'];
1237                } elseif ($ac[$i]['AchievementCondition']['category'] == 'sprint') {
1238                    $ac1['sprint'] = $ac[$i]['AchievementCondition']['value'];
1239                } elseif ($ac[$i]['AchievementCondition']['category'] == 'golden') {
1240                    $ac1['golden'] = $ac[$i]['AchievementCondition']['value'];
1241                } elseif ($ac[$i]['AchievementCondition']['category'] == 'potion') {
1242                    $ac1['potion'] = $ac[$i]['AchievementCondition']['value'];
1243                }
1244            }
1245
1246            $existingAs = [];
1247            $bufferCount = count($buffer);
1248            for ($i = 0; $i < $bufferCount; $i++) {
1249                $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1250            }
1251            $as = [];
1252            $as['AchievementStatus']['user_id'] = Auth::getUserID();
1253            $updated = [];
1254            $achievementId = 101;
1255            if ($ac1['1d'] > 0 && !isset($existingAs[$achievementId])) {
1256                $as['AchievementStatus']['achievement_id'] = $achievementId;
1257                ClassRegistry::init('AchievementStatus')->create();
1258                ClassRegistry::init('AchievementStatus')->save($as);
1259                array_push($updated, $achievementId);
1260            }
1261            $achievementId = 102;
1262            if ($ac1['2d'] > 0 && !isset($existingAs[$achievementId])) {
1263                $as['AchievementStatus']['achievement_id'] = $achievementId;
1264                ClassRegistry::init('AchievementStatus')->create();
1265                ClassRegistry::init('AchievementStatus')->save($as);
1266                array_push($updated, $achievementId);
1267            }
1268            $achievementId = 103;
1269            if ($ac1['3d'] > 0 && !isset($existingAs[$achievementId])) {
1270                $as['AchievementStatus']['achievement_id'] = $achievementId;
1271                ClassRegistry::init('AchievementStatus')->create();
1272                ClassRegistry::init('AchievementStatus')->save($as);
1273                array_push($updated, $achievementId);
1274            }
1275            $achievementId = 104;
1276            if ($ac1['4d'] > 0 && !isset($existingAs[$achievementId])) {
1277                $as['AchievementStatus']['achievement_id'] = $achievementId;
1278                ClassRegistry::init('AchievementStatus')->create();
1279                ClassRegistry::init('AchievementStatus')->save($as);
1280                array_push($updated, $achievementId);
1281            }
1282            $achievementId = 105;
1283            if ($ac1['5d'] > 0 && !isset($existingAs[$achievementId])) {
1284                $as['AchievementStatus']['achievement_id'] = $achievementId;
1285                ClassRegistry::init('AchievementStatus')->create();
1286                ClassRegistry::init('AchievementStatus')->save($as);
1287                array_push($updated, $achievementId);
1288            }
1289            $achievementId = 106;
1290            if ($ac1['1d'] >= 10 && !isset($existingAs[$achievementId])) {
1291                $as['AchievementStatus']['achievement_id'] = $achievementId;
1292                ClassRegistry::init('AchievementStatus')->create();
1293                ClassRegistry::init('AchievementStatus')->save($as);
1294                array_push($updated, $achievementId);
1295            }
1296            $achievementId = 107;
1297            if ($ac1['2d'] >= 10 && !isset($existingAs[$achievementId])) {
1298                $as['AchievementStatus']['achievement_id'] = $achievementId;
1299                ClassRegistry::init('AchievementStatus')->create();
1300                ClassRegistry::init('AchievementStatus')->save($as);
1301                array_push($updated, $achievementId);
1302            }
1303            $achievementId = 108;
1304            if ($ac1['3d'] >= 10 && !isset($existingAs[$achievementId])) {
1305                $as['AchievementStatus']['achievement_id'] = $achievementId;
1306                ClassRegistry::init('AchievementStatus')->create();
1307                ClassRegistry::init('AchievementStatus')->save($as);
1308                array_push($updated, $achievementId);
1309            }
1310            $achievementId = 109;
1311            if ($ac1['4d'] >= 10 && !isset($existingAs[$achievementId])) {
1312                $as['AchievementStatus']['achievement_id'] = $achievementId;
1313                ClassRegistry::init('AchievementStatus')->create();
1314                ClassRegistry::init('AchievementStatus')->save($as);
1315                array_push($updated, $achievementId);
1316            }
1317            $achievementId = 110;
1318            if ($ac1['5d'] >= 10 && !isset($existingAs[$achievementId])) {
1319                $as['AchievementStatus']['achievement_id'] = $achievementId;
1320                ClassRegistry::init('AchievementStatus')->create();
1321                ClassRegistry::init('AchievementStatus')->save($as);
1322                array_push($updated, $achievementId);
1323            }
1324            $achievementId = 111;
1325            if (isset($ac1['emerald'])) {
1326                if ($ac1['emerald'] == 1 && !isset($existingAs[$achievementId])) {
1327                    $as['AchievementStatus']['achievement_id'] = $achievementId;
1328                    ClassRegistry::init('AchievementStatus')->create();
1329                    ClassRegistry::init('AchievementStatus')->save($as);
1330                    array_push($updated, $achievementId);
1331                }
1332            }
1333            $achievementId = 112;
1334            if (isset($ac1['sapphire'])) {
1335                if ($ac1['sapphire'] == 1 && !isset($existingAs[$achievementId])) {
1336                    $as['AchievementStatus']['achievement_id'] = $achievementId;
1337                    ClassRegistry::init('AchievementStatus')->create();
1338                    ClassRegistry::init('AchievementStatus')->save($as);
1339                    array_push($updated, $achievementId);
1340                }
1341            }
1342            $achievementId = 113;
1343            if (isset($ac1['ruby'])) {
1344                if ($ac1['ruby'] == 1 && !isset($existingAs[$achievementId])) {
1345                    $as['AchievementStatus']['achievement_id'] = $achievementId;
1346                    ClassRegistry::init('AchievementStatus')->create();
1347                    ClassRegistry::init('AchievementStatus')->save($as);
1348                    array_push($updated, $achievementId);
1349                }
1350            }
1351            $achievementId = 114;
1352            if (!isset($existingAs[$achievementId]) && isset($existingAs[111]) && isset($existingAs[112]) && isset($existingAs[113])) {
1353                $as['AchievementStatus']['achievement_id'] = $achievementId;
1354                ClassRegistry::init('AchievementStatus')->create();
1355                ClassRegistry::init('AchievementStatus')->save($as);
1356                array_push($updated, $achievementId);
1357            }
1358            $achievementId = 96;
1359            if (!isset($existingAs[$achievementId]) && $ac1['sprint'] >= 30) {
1360                $as['AchievementStatus']['achievement_id'] = $achievementId;
1361                ClassRegistry::init('AchievementStatus')->create();
1362                ClassRegistry::init('AchievementStatus')->save($as);
1363                array_push($updated, $achievementId);
1364            }
1365            $achievementId = 97;
1366            if (!isset($existingAs[$achievementId]) && $ac1['golden'] >= 10) {
1367                $as['AchievementStatus']['achievement_id'] = $achievementId;
1368                ClassRegistry::init('AchievementStatus')->create();
1369                ClassRegistry::init('AchievementStatus')->save($as);
1370                array_push($updated, $achievementId);
1371            }
1372            $achievementId = 98;
1373            if (!isset($existingAs[$achievementId]) && $ac1['potion'] >= 1) {
1374                $as['AchievementStatus']['achievement_id'] = $achievementId;
1375                ClassRegistry::init('AchievementStatus')->create();
1376                ClassRegistry::init('AchievementStatus')->save($as);
1377                array_push($updated, $achievementId);
1378            }
1379            $updatedCount = count($updated);
1380            for ($i = 0; $i < $updatedCount; $i++) {
1381                $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1382                $updated[$i] = [];
1383                $updated[$i][0] = $a['Achievement']['name'];
1384                $updated[$i][1] = $a['Achievement']['description'];
1385                $updated[$i][2] = $a['Achievement']['image'];
1386                $updated[$i][3] = $a['Achievement']['color'];
1387                $updated[$i][4] = $a['Achievement']['xp'];
1388                $updated[$i][5] = $a['Achievement']['id'];
1389            }
1390
1391            return $updated;
1392        }
1393    }
1394
1395    protected function checkForLocked($t, $setsWithPremium) {
1396        $scCheck = $this->SetConnection->find('first', ['conditions' => ['tsumego_id' => $t['Tsumego']['id']]]);
1397        if ($scCheck && in_array($scCheck['SetConnection']['set_id'], $setsWithPremium) && !Auth::hasPremium()) {
1398            $t['Tsumego']['locked'] = true;
1399        } else {
1400            $t['Tsumego']['locked'] = false;
1401        }
1402
1403        return $t;
1404    }
1405    public static function checkNoErrorAchievements() {
1406        if (Auth::isLoggedIn()) {
1407
1408            $ac = ClassRegistry::init('AchievementCondition')->find('first', [
1409                'order' => 'value DESC',
1410                'conditions' => [
1411                    'user_id' => Auth::getUserID(),
1412                    'category' => 'err',
1413                ],
1414            ]);
1415
1416            $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1417            if (!$buffer) {
1418                $buffer = [];
1419            }
1420            $existingAs = [];
1421            $bufferCount = count($buffer);
1422            for ($i = 0; $i < $bufferCount; $i++) {
1423                $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1424            }
1425            $as = [];
1426            $as['AchievementStatus']['user_id'] = Auth::getUserID();
1427            $updated = [];
1428
1429            $achievementId = 53;
1430            if ($ac['AchievementCondition']['value'] >= 10 && !isset($existingAs[$achievementId])) {
1431                $as['AchievementStatus']['achievement_id'] = $achievementId;
1432                ClassRegistry::init('AchievementStatus')->create();
1433                ClassRegistry::init('AchievementStatus')->save($as);
1434                array_push($updated, $achievementId);
1435            }
1436            $achievementId = 54;
1437            if ($ac['AchievementCondition']['value'] >= 20 && !isset($existingAs[$achievementId])) {
1438                $as['AchievementStatus']['achievement_id'] = $achievementId;
1439                ClassRegistry::init('AchievementStatus')->create();
1440                ClassRegistry::init('AchievementStatus')->save($as);
1441                array_push($updated, $achievementId);
1442            }
1443            $achievementId = 55;
1444            if ($ac['AchievementCondition']['value'] >= 30 && !isset($existingAs[$achievementId])) {
1445                $as['AchievementStatus']['achievement_id'] = $achievementId;
1446                ClassRegistry::init('AchievementStatus')->create();
1447                ClassRegistry::init('AchievementStatus')->save($as);
1448                array_push($updated, $achievementId);
1449            }
1450            $achievementId = 56;
1451            if ($ac['AchievementCondition']['value'] >= 50 && !isset($existingAs[$achievementId])) {
1452                $as['AchievementStatus']['achievement_id'] = $achievementId;
1453                ClassRegistry::init('AchievementStatus')->create();
1454                ClassRegistry::init('AchievementStatus')->save($as);
1455                array_push($updated, $achievementId);
1456            }
1457            $achievementId = 57;
1458            if ($ac['AchievementCondition']['value'] >= 100 && !isset($existingAs[$achievementId])) {
1459                $as['AchievementStatus']['achievement_id'] = $achievementId;
1460                ClassRegistry::init('AchievementStatus')->create();
1461                ClassRegistry::init('AchievementStatus')->save($as);
1462                array_push($updated, $achievementId);
1463            }
1464            $achievementId = 58;
1465            if ($ac['AchievementCondition']['value'] >= 200 && !isset($existingAs[$achievementId])) {
1466                $as['AchievementStatus']['achievement_id'] = $achievementId;
1467                ClassRegistry::init('AchievementStatus')->create();
1468                ClassRegistry::init('AchievementStatus')->save($as);
1469                array_push($updated, $achievementId);
1470            }
1471            $updatedCount = count($updated);
1472            for ($i = 0; $i < $updatedCount; $i++) {
1473                $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1474                $updated[$i] = [];
1475                $updated[$i][0] = $a['Achievement']['name'];
1476                $updated[$i][1] = $a['Achievement']['description'];
1477                $updated[$i][2] = $a['Achievement']['image'];
1478                $updated[$i][3] = $a['Achievement']['color'];
1479                $updated[$i][4] = $a['Achievement']['xp'];
1480                $updated[$i][5] = $a['Achievement']['id'];
1481            }
1482
1483            return $updated;
1484        }
1485    }
1486
1487    protected function checkTimeModeAchievements() {
1488        $this->loadModel('Achievement');
1489        $this->loadModel('AchievementStatus');
1490        $this->loadModel('TimeModeSession');
1491
1492        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1493        if (!$buffer) {
1494            $buffer = [];
1495        }
1496        $existingAs = [];
1497        $bufferCount = count($buffer);
1498        for ($i = 0; $i < $bufferCount; $i++) {
1499            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1500        }
1501        $as = [];
1502        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1503        $updated = [];
1504
1505        $rBlitz = $this->TimeModeSession->find('all', ['conditions' => ['time_mode_category_id' => TimeModeUtil::$CATEGORY_BLITZ, 'user_id' => Auth::getUserID()]]);
1506        if (!$rBlitz) {
1507            $rBlitz = [];
1508        }
1509        $rFast = $this->TimeModeSession->find('all', ['conditions' => ['time_mode_category_id' => TimeModeUtil::$CATEGORY_FAST_SPEED, 'user_id' => Auth::getUserID()]]);
1510        if (!$rFast) {
1511            $rFast = [];
1512        }
1513        $rSlow = $this->TimeModeSession->find('all', ['conditions' => ['time_mode_category_id' => TimeModeUtil::$CATEGORY_SLOW_SPEED, 'user_id' => Auth::getUserID()]]);
1514        if (!$rSlow) {
1515            $rSlow = [];
1516        }
1517        $r = $this->TimeModeSession->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1518        if (!$r) {
1519            $r = [];
1520        }
1521
1522        $timeModeAchievements = [];
1523        for ($i = 70; $i <= 91; $i++) {
1524            $timeModeAchievements[$i] = false;
1525        }
1526        $rCount = count($r);
1527        for ($i = 0; $i < $rCount; $i++) {
1528            if ($r[$i]['TimeModeSession']['status'] == 's') {
1529                if ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '5k') {
1530                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1531                        $timeModeAchievements[70] = true;
1532                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1533                        $timeModeAchievements[76] = true;
1534                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1535                        $timeModeAchievements[82] = true;
1536                    }
1537                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k') {
1538                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1539                        $timeModeAchievements[71] = true;
1540                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1541                        $timeModeAchievements[77] = true;
1542                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1543                        $timeModeAchievements[83] = true;
1544                    }
1545                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k') {
1546                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1547                        $timeModeAchievements[72] = true;
1548                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1549                        $timeModeAchievements[78] = true;
1550                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1551                        $timeModeAchievements[84] = true;
1552                    }
1553                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k') {
1554                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1555                        $timeModeAchievements[73] = true;
1556                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1557                        $timeModeAchievements[79] = true;
1558                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1559                        $timeModeAchievements[85] = true;
1560                    }
1561                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k') {
1562                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1563                        $timeModeAchievements[74] = true;
1564                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1565                        $timeModeAchievements[80] = true;
1566                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1567                        $timeModeAchievements[86] = true;
1568                    }
1569                } elseif ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d') {
1570                    if ($r[$i]['TimeModeSession']['mode'] == 2) {
1571                        $timeModeAchievements[75] = true;
1572                    } elseif ($r[$i]['TimeModeSession']['mode'] == 1) {
1573                        $timeModeAchievements[81] = true;
1574                    } elseif ($r[$i]['TimeModeSession']['mode'] == 0) {
1575                        $timeModeAchievements[87] = true;
1576                    }
1577                }
1578            }
1579            if ($r[$i]['TimeModeSession']['points'] >= 850
1580            && ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k'
1581            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '4d'
1582            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5d')) {
1583                $timeModeAchievements[91] = true;
1584            }
1585            if ($r[$i]['TimeModeSession']['points'] >= 875
1586            && ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k'
1587            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '4d'
1588            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '6k')) {
1589                $timeModeAchievements[90] = true;
1590            }
1591            if ($r[$i]['TimeModeSession']['points'] >= 900
1592            && ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k'
1593            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '4d'
1594            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '6k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '7k'
1595            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '8k')) {
1596                $timeModeAchievements[89] = true;
1597            }
1598            if ($r[$i]['TimeModeSession']['points'] >= 950
1599            && ($r[$i]['TimeModeSession']['TimeModeAttempt'] == '4k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1k'
1600            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '1d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '2d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '3d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '4d'
1601            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5d' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '5k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '6k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '7k'
1602            || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '8k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '9k' || $r[$i]['TimeModeSession']['TimeModeAttempt'] == '10k')) {
1603                $timeModeAchievements[88] = true;
1604            }
1605        }
1606        for ($i = 70; $i <= 91; $i++) {
1607            $achievementId = $i;
1608            if ($timeModeAchievements[$achievementId] == true && !isset($existingAs[$achievementId])) {
1609                $as['AchievementStatus']['achievement_id'] = $achievementId;
1610                ClassRegistry::init('AchievementStatus')->create();
1611                ClassRegistry::init('AchievementStatus')->save($as);
1612                array_push($updated, $achievementId);
1613            }
1614        }
1615        $updatedCount = count($updated);
1616        for ($i = 0; $i < $updatedCount; $i++) {
1617            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1618            $updated[$i] = [];
1619            $updated[$i][0] = $a['Achievement']['name'];
1620            $updated[$i][1] = $a['Achievement']['description'];
1621            $updated[$i][2] = $a['Achievement']['image'];
1622            $updated[$i][3] = $a['Achievement']['color'];
1623            $updated[$i][4] = $a['Achievement']['xp'];
1624            $updated[$i][5] = $a['Achievement']['id'];
1625        }
1626
1627        return $updated;
1628    }
1629
1630    public static function checkRatingAchievements() {
1631        if (!Auth::isLoggedIn()) {
1632            return;
1633        }
1634
1635        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1636        if (!$buffer) {
1637            $buffer = [];
1638        }
1639        $existingAs = [];
1640        $bufferCount = count($buffer);
1641        for ($i = 0; $i < $bufferCount; $i++) {
1642            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1643        }
1644        $as = [];
1645        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1646        $updated = [];
1647
1648        $achievementId = 59;
1649        $currentElo = Auth::getUser()['rating'];
1650        if ($currentElo >= 1500 && !isset($existingAs[$achievementId])) {
1651            $as['AchievementStatus']['achievement_id'] = $achievementId;
1652            ClassRegistry::init('AchievementStatus')->create();
1653            ClassRegistry::init('AchievementStatus')->save($as);
1654            array_push($updated, $achievementId);
1655        }
1656        $achievementId = 60;
1657        if ($currentElo >= 1600 && !isset($existingAs[$achievementId])) {
1658            $as['AchievementStatus']['achievement_id'] = $achievementId;
1659            ClassRegistry::init('AchievementStatus')->create();
1660            ClassRegistry::init('AchievementStatus')->save($as);
1661            array_push($updated, $achievementId);
1662        }
1663        $achievementId = 61;
1664        if ($currentElo >= 1700 && !isset($existingAs[$achievementId])) {
1665            $as['AchievementStatus']['achievement_id'] = $achievementId;
1666            ClassRegistry::init('AchievementStatus')->create();
1667            ClassRegistry::init('AchievementStatus')->save($as);
1668            array_push($updated, $achievementId);
1669        }
1670        $achievementId = 62;
1671        if ($currentElo >= 1800 && !isset($existingAs[$achievementId])) {
1672            $as['AchievementStatus']['achievement_id'] = $achievementId;
1673            ClassRegistry::init('AchievementStatus')->create();
1674            ClassRegistry::init('AchievementStatus')->save($as);
1675            array_push($updated, $achievementId);
1676        }
1677        $achievementId = 63;
1678        if ($currentElo >= 1900 && !isset($existingAs[$achievementId])) {
1679            $as['AchievementStatus']['achievement_id'] = $achievementId;
1680            ClassRegistry::init('AchievementStatus')->create();
1681            ClassRegistry::init('AchievementStatus')->save($as);
1682            array_push($updated, $achievementId);
1683        }
1684        $achievementId = 64;
1685        if ($currentElo >= 2000 && !isset($existingAs[$achievementId])) {
1686            $as['AchievementStatus']['achievement_id'] = $achievementId;
1687            ClassRegistry::init('AchievementStatus')->create();
1688            ClassRegistry::init('AchievementStatus')->save($as);
1689            array_push($updated, $achievementId);
1690        }
1691        $achievementId = 65;
1692        if ($currentElo >= 2100 && !isset($existingAs[$achievementId])) {
1693            $as['AchievementStatus']['achievement_id'] = $achievementId;
1694            ClassRegistry::init('AchievementStatus')->create();
1695            ClassRegistry::init('AchievementStatus')->save($as);
1696            array_push($updated, $achievementId);
1697        }
1698        $achievementId = 66;
1699        if ($currentElo >= 2200 && !isset($existingAs[$achievementId])) {
1700            $as['AchievementStatus']['achievement_id'] = $achievementId;
1701            ClassRegistry::init('AchievementStatus')->create();
1702            ClassRegistry::init('AchievementStatus')->save($as);
1703            array_push($updated, $achievementId);
1704        }
1705        $achievementId = 67;
1706        if ($currentElo >= 2300 && !isset($existingAs[$achievementId])) {
1707            $as['AchievementStatus']['achievement_id'] = $achievementId;
1708            ClassRegistry::init('AchievementStatus')->create();
1709            ClassRegistry::init('AchievementStatus')->save($as);
1710            array_push($updated, $achievementId);
1711        }
1712        $achievementId = 68;
1713        if ($currentElo >= 2400 && !isset($existingAs[$achievementId])) {
1714            $as['AchievementStatus']['achievement_id'] = $achievementId;
1715            ClassRegistry::init('AchievementStatus')->create();
1716            ClassRegistry::init('AchievementStatus')->save($as);
1717            array_push($updated, $achievementId);
1718        }
1719        $achievementId = 69;
1720        if ($currentElo >= 2500 && !isset($existingAs[$achievementId])) {
1721            $as['AchievementStatus']['achievement_id'] = $achievementId;
1722            ClassRegistry::init('AchievementStatus')->create();
1723            ClassRegistry::init('AchievementStatus')->save($as);
1724            array_push($updated, $achievementId);
1725        }
1726        $updatedCount = count($updated);
1727        for ($i = 0; $i < $updatedCount; $i++) {
1728            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1729            $updated[$i] = [];
1730            $updated[$i][0] = $a['Achievement']['name'];
1731            $updated[$i][1] = $a['Achievement']['description'];
1732            $updated[$i][2] = $a['Achievement']['image'];
1733            $updated[$i][3] = $a['Achievement']['color'];
1734            $updated[$i][4] = $a['Achievement']['xp'];
1735            $updated[$i][5] = $a['Achievement']['id'];
1736        }
1737
1738        return $updated;
1739    }
1740
1741    public static function checkLevelAchievements() {
1742        if (!Auth::isLoggedIn()) {
1743            return;
1744        }
1745        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1746        if (!$buffer) {
1747            $buffer = [];
1748        }
1749        $existingAs = [];
1750        $bufferCount = count($buffer);
1751        for ($i = 0; $i < $bufferCount; $i++) {
1752            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1753        }
1754        $as = [];
1755        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1756        $updated = [];
1757
1758        $achievementId = 36;
1759        $userLevel = Auth::getUser()['level'];
1760        if ($userLevel >= 10 && !isset($existingAs[$achievementId])) {
1761            $as['AchievementStatus']['achievement_id'] = $achievementId;
1762            ClassRegistry::init('AchievementStatus')->create();
1763            ClassRegistry::init('AchievementStatus')->save($as);
1764            array_push($updated, $achievementId);
1765        }
1766        $achievementId = 37;
1767        if ($userLevel >= 20 && !isset($existingAs[$achievementId])) {
1768            $as['AchievementStatus']['achievement_id'] = $achievementId;
1769            ClassRegistry::init('AchievementStatus')->create();
1770            ClassRegistry::init('AchievementStatus')->save($as);
1771            array_push($updated, $achievementId);
1772        }
1773        $achievementId = 38;
1774        if ($userLevel >= 30 && !isset($existingAs[$achievementId])) {
1775            $as['AchievementStatus']['achievement_id'] = $achievementId;
1776            ClassRegistry::init('AchievementStatus')->create();
1777            ClassRegistry::init('AchievementStatus')->save($as);
1778            array_push($updated, $achievementId);
1779        }
1780        $achievementId = 39;
1781        if ($userLevel >= 40 && !isset($existingAs[$achievementId])) {
1782            $as['AchievementStatus']['achievement_id'] = $achievementId;
1783            ClassRegistry::init('AchievementStatus')->create();
1784            ClassRegistry::init('AchievementStatus')->save($as);
1785            array_push($updated, $achievementId);
1786        }
1787        $achievementId = 40;
1788        if ($userLevel >= 50 && !isset($existingAs[$achievementId])) {
1789            $as['AchievementStatus']['achievement_id'] = $achievementId;
1790            ClassRegistry::init('AchievementStatus')->create();
1791            ClassRegistry::init('AchievementStatus')->save($as);
1792            array_push($updated, $achievementId);
1793        }
1794        $achievementId = 41;
1795        if ($userLevel >= 60 && !isset($existingAs[$achievementId])) {
1796            $as['AchievementStatus']['achievement_id'] = $achievementId;
1797            ClassRegistry::init('AchievementStatus')->create();
1798            ClassRegistry::init('AchievementStatus')->save($as);
1799            array_push($updated, $achievementId);
1800        }
1801        $achievementId = 42;
1802        if ($userLevel >= 70 && !isset($existingAs[$achievementId])) {
1803            $as['AchievementStatus']['achievement_id'] = $achievementId;
1804            ClassRegistry::init('AchievementStatus')->create();
1805            ClassRegistry::init('AchievementStatus')->save($as);
1806            array_push($updated, $achievementId);
1807        }
1808        $achievementId = 43;
1809        if ($userLevel >= 80 && !isset($existingAs[$achievementId])) {
1810            $as['AchievementStatus']['achievement_id'] = $achievementId;
1811            ClassRegistry::init('AchievementStatus')->create();
1812            ClassRegistry::init('AchievementStatus')->save($as);
1813            array_push($updated, $achievementId);
1814        }
1815        $achievementId = 44;
1816        if ($userLevel >= 90 && !isset($existingAs[$achievementId])) {
1817            $as['AchievementStatus']['achievement_id'] = $achievementId;
1818            ClassRegistry::init('AchievementStatus')->create();
1819            ClassRegistry::init('AchievementStatus')->save($as);
1820            array_push($updated, $achievementId);
1821        }
1822        $achievementId = 45;
1823        if ($userLevel >= 100 && !isset($existingAs[$achievementId])) {
1824            $as['AchievementStatus']['achievement_id'] = $achievementId;
1825            ClassRegistry::init('AchievementStatus')->create();
1826            ClassRegistry::init('AchievementStatus')->save($as);
1827            array_push($updated, $achievementId);
1828        }
1829        $achievementId = 100;
1830        if (Auth::hasPremium() && !isset($existingAs[$achievementId])) {
1831            $as['AchievementStatus']['achievement_id'] = $achievementId;
1832            ClassRegistry::init('AchievementStatus')->create();
1833            ClassRegistry::init('AchievementStatus')->save($as);
1834            array_push($updated, $achievementId);
1835        }
1836        $updatedCount = count($updated);
1837        for ($i = 0; $i < $updatedCount; $i++) {
1838            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1839            $updated[$i] = [];
1840            $updated[$i][0] = $a['Achievement']['name'];
1841            $updated[$i][1] = $a['Achievement']['description'];
1842            $updated[$i][2] = $a['Achievement']['image'];
1843            $updated[$i][3] = $a['Achievement']['color'];
1844            $updated[$i][4] = $a['Achievement']['xp'];
1845            $updated[$i][5] = $a['Achievement']['id'];
1846        }
1847
1848        return $updated;
1849    }
1850
1851    protected function checkSetCompletedAchievements() {
1852        $this->loadModel('Set');
1853        $this->loadModel('Tsumego');
1854        $this->loadModel('Achievement');
1855        $this->loadModel('AchievementStatus');
1856        $this->loadModel('AchievementCondition');
1857
1858        $ac = ClassRegistry::init('AchievementCondition')->find('first', [
1859            'order' => 'value DESC',
1860            'conditions' => [
1861                'user_id' => Auth::getUserID(),
1862                'category' => 'set',
1863            ],
1864        ]);
1865
1866        if (!$ac) {
1867            return [];
1868        }
1869
1870        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1871        if (!$buffer) {
1872            $buffer = [];
1873        }
1874        $existingAs = [];
1875        $bufferCount = count($buffer);
1876        for ($i = 0; $i < $bufferCount; $i++) {
1877            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1878        }
1879        $as = [];
1880        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1881        $updated = [];
1882
1883        $achievementId = 47;
1884        if ($ac['AchievementCondition']['value'] >= 10 && !isset($existingAs[$achievementId])) {
1885            $as['AchievementStatus']['achievement_id'] = $achievementId;
1886            ClassRegistry::init('AchievementStatus')->create();
1887            ClassRegistry::init('AchievementStatus')->save($as);
1888            array_push($updated, $achievementId);
1889        }
1890        $achievementId = 48;
1891        if ($ac['AchievementCondition']['value'] >= 20 && !isset($existingAs[$achievementId])) {
1892            $as['AchievementStatus']['achievement_id'] = $achievementId;
1893            ClassRegistry::init('AchievementStatus')->create();
1894            ClassRegistry::init('AchievementStatus')->save($as);
1895            array_push($updated, $achievementId);
1896        }
1897        $achievementId = 49;
1898        if ($ac['AchievementCondition']['value'] >= 30 && !isset($existingAs[$achievementId])) {
1899            $as['AchievementStatus']['achievement_id'] = $achievementId;
1900            ClassRegistry::init('AchievementStatus')->create();
1901            ClassRegistry::init('AchievementStatus')->save($as);
1902            array_push($updated, $achievementId);
1903        }
1904        $achievementId = 50;
1905        if ($ac['AchievementCondition']['value'] >= 40 && !isset($existingAs[$achievementId])) {
1906            $as['AchievementStatus']['achievement_id'] = $achievementId;
1907            ClassRegistry::init('AchievementStatus')->create();
1908            ClassRegistry::init('AchievementStatus')->save($as);
1909            array_push($updated, $achievementId);
1910        }
1911        $achievementId = 51;
1912        if ($ac['AchievementCondition']['value'] >= 50 && !isset($existingAs[$achievementId])) {
1913            $as['AchievementStatus']['achievement_id'] = $achievementId;
1914            ClassRegistry::init('AchievementStatus')->create();
1915            ClassRegistry::init('AchievementStatus')->save($as);
1916            array_push($updated, $achievementId);
1917        }
1918        $achievementId = 52;
1919        if ($ac['AchievementCondition']['value'] >= 60 && !isset($existingAs[$achievementId])) {
1920            $as['AchievementStatus']['achievement_id'] = $achievementId;
1921            ClassRegistry::init('AchievementStatus')->create();
1922            ClassRegistry::init('AchievementStatus')->save($as);
1923            array_push($updated, $achievementId);
1924        }
1925        $updatedCount = count($updated);
1926        for ($i = 0; $i < $updatedCount; $i++) {
1927            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
1928            $updated[$i] = [];
1929            $updated[$i][0] = $a['Achievement']['name'];
1930            $updated[$i][1] = $a['Achievement']['description'];
1931            $updated[$i][2] = $a['Achievement']['image'];
1932            $updated[$i][3] = $a['Achievement']['color'];
1933            $updated[$i][4] = $a['Achievement']['xp'];
1934            $updated[$i][5] = $a['Achievement']['id'];
1935        }
1936
1937        return $updated;
1938    }
1939
1940    protected function setAchievementSpecial($s = null) {
1941        $this->loadModel('Set');
1942        $this->loadModel('Tsumego');
1943        $this->loadModel('TsumegoStatus');
1944        $this->loadModel('Achievement');
1945        $this->loadModel('AchievementStatus');
1946        $this->loadModel('SetConnection');
1947
1948        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
1949        if (!$buffer) {
1950            $buffer = [];
1951        }
1952        $existingAs = [];
1953        $bufferCount = count($buffer);
1954        for ($i = 0; $i < $bufferCount; $i++) {
1955            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
1956        }
1957        $as = [];
1958        $as['AchievementStatus']['user_id'] = Auth::getUserID();
1959        $updated = [];
1960
1961        $tsIds = [];
1962        $completed = '';
1963        if ($s == 'cc1') {
1964            $ts1 = TsumegoUtil::collectTsumegosFromSet(50);
1965            $ts2 = TsumegoUtil::collectTsumegosFromSet(52);
1966            $ts3 = TsumegoUtil::collectTsumegosFromSet(53);
1967            $ts4 = TsumegoUtil::collectTsumegosFromSet(54);
1968            $ts = array_merge($ts1, $ts2, $ts3, $ts4);
1969            $tsCount = count($ts);
1970            for ($i = 0; $i < $tsCount; $i++) {
1971                array_push($tsIds, $ts[$i]['Tsumego']['id']);
1972            }
1973            $uts = $this->TsumegoStatus->find('all', [
1974                'conditions' => [
1975                    'user_id' => Auth::getUserID(),
1976                    'tsumego_id' => $tsIds,
1977                ],
1978            ]);
1979            if (!$uts) {
1980                $uts = [];
1981            }
1982            $counter = 0;
1983            $utsCount = count($uts);
1984            for ($j = 0; $j < $utsCount; $j++) {
1985                for ($k = 0; $k < $tsCount; $k++) {
1986                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
1987                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
1988                        $counter++;
1989                    }
1990                }
1991            }
1992            if ($counter == count($ts)) {
1993                $completed = $s;
1994            }
1995        } elseif ($s == 'cc2') {
1996            $ts1 = TsumegoUtil::collectTsumegosFromSet(41);
1997            $ts2 = TsumegoUtil::collectTsumegosFromSet(49);
1998            $ts3 = TsumegoUtil::collectTsumegosFromSet(65);
1999            $ts4 = TsumegoUtil::collectTsumegosFromSet(66);
2000            $ts = array_merge($ts1, $ts2, $ts3, $ts4);
2001            $tsCount = count($ts);
2002            for ($i = 0; $i < $tsCount; $i++) {
2003                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2004            }
2005            $uts = $this->TsumegoStatus->find('all', [
2006                'conditions' => [
2007                    'user_id' => Auth::getUserID(),
2008                    'tsumego_id' => $tsIds,
2009                ],
2010            ]);
2011            if (!$uts) {
2012                $uts = [];
2013            }
2014            $counter = 0;
2015            $utsCount = count($uts);
2016            for ($j = 0; $j < $utsCount; $j++) {
2017                for ($k = 0; $k < $tsCount; $k++) {
2018                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2019                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2020                        $counter++;
2021                    }
2022                }
2023            }
2024            if ($counter == count($ts)) {
2025                $completed = $s;
2026            }
2027        } elseif ($s == 'cc3') {
2028            $ts1 = TsumegoUtil::collectTsumegosFromSet(186);
2029            $ts2 = TsumegoUtil::collectTsumegosFromSet(187);
2030            $ts3 = TsumegoUtil::collectTsumegosFromSet(196);
2031            $ts4 = TsumegoUtil::collectTsumegosFromSet(203);
2032            $ts = array_merge($ts1, $ts2, $ts3, $ts4);
2033            $tsCount = count($ts);
2034            for ($i = 0; $i < $tsCount; $i++) {
2035                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2036            }
2037            $uts = $this->TsumegoStatus->find('all', [
2038                'conditions' => [
2039                    'user_id' => Auth::getUserID(),
2040                    'tsumego_id' => $tsIds,
2041                ],
2042            ]);
2043            if (!$uts) {
2044                $uts = [];
2045            }
2046            $counter = 0;
2047            $utsCount = count($uts);
2048            for ($j = 0; $j < $utsCount; $j++) {
2049                for ($k = 0; $k < $tsCount; $k++) {
2050                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2051                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2052                        $counter++;
2053                    }
2054                }
2055            }
2056            if ($counter == count($ts)) {
2057                $completed = $s;
2058            }
2059        } elseif ($s == '1000w1') {
2060            $ts1 = TsumegoUtil::collectTsumegosFromSet(190);
2061            $ts2 = TsumegoUtil::collectTsumegosFromSet(193);
2062            $ts3 = TsumegoUtil::collectTsumegosFromSet(198);
2063            $ts = array_merge($ts1, $ts2, $ts3);
2064            $tsCount = count($ts);
2065            for ($i = 0; $i < $tsCount; $i++) {
2066                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2067            }
2068            $uts = $this->TsumegoStatus->find('all', [
2069                'conditions' => [
2070                    'user_id' => Auth::getUserID(),
2071                    'tsumego_id' => $tsIds,
2072                ],
2073            ]);
2074            if (!$uts) {
2075                $uts = [];
2076            }
2077            $counter = 0;
2078            $utsCount = count($uts);
2079            for ($j = 0; $j < $utsCount; $j++) {
2080                for ($k = 0; $k < $tsCount; $k++) {
2081                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2082                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2083                        $counter++;
2084                    }
2085                }
2086            }
2087            if ($counter == count($ts)) {
2088                $completed = $s;
2089            }
2090        } elseif ($s == '1000w2') {
2091            $ts = TsumegoUtil::collectTsumegosFromSet(216);
2092            $tsCount = count($ts);
2093            for ($i = 0; $i < $tsCount; $i++) {
2094                array_push($tsIds, $ts[$i]['Tsumego']['id']);
2095            }
2096            $uts = $this->TsumegoStatus->find('all', [
2097                'conditions' => [
2098                    'user_id' => Auth::getUserID(),
2099                    'tsumego_id' => $tsIds,
2100                ],
2101            ]);
2102            if (!$uts) {
2103                $uts = [];
2104            }
2105            $counter = 0;
2106            $utsCount = count($uts);
2107            for ($j = 0; $j < $utsCount; $j++) {
2108                for ($k = 0; $k < $tsCount; $k++) {
2109                    if ($uts[$j]['TsumegoStatus']['tsumego_id'] == $ts[$k]['Tsumego']['id'] && ($uts[$j]['TsumegoStatus']['status'] == 'S'
2110                    || $uts[$j]['TsumegoStatus']['status'] == 'W' || $uts[$j]['TsumegoStatus']['status'] == 'C')) {
2111                        $counter++;
2112                    }
2113                }
2114            }
2115            if ($counter == count($ts)) {
2116                $completed = $s;
2117            }
2118        }
2119
2120        $achievementId = 92;
2121        if ($completed == 'cc1' && !isset($existingAs[$achievementId])) {
2122            $as['AchievementStatus']['achievement_id'] = $achievementId;
2123            ClassRegistry::init('AchievementStatus')->create();
2124            ClassRegistry::init('AchievementStatus')->save($as);
2125            array_push($updated, $achievementId);
2126        }
2127        $achievementId = 93;
2128        if ($completed == 'cc2' && !isset($existingAs[$achievementId])) {
2129            $as['AchievementStatus']['achievement_id'] = $achievementId;
2130            ClassRegistry::init('AchievementStatus')->create();
2131            ClassRegistry::init('AchievementStatus')->save($as);
2132            array_push($updated, $achievementId);
2133        }
2134        $achievementId = 94;
2135        if ($completed == 'cc3' && !isset($existingAs[$achievementId])) {
2136            $as['AchievementStatus']['achievement_id'] = $achievementId;
2137            ClassRegistry::init('AchievementStatus')->create();
2138            ClassRegistry::init('AchievementStatus')->save($as);
2139            array_push($updated, $achievementId);
2140        }
2141        $achievementId = 95;
2142        if ($completed == '1000w1' && !isset($existingAs[$achievementId])) {
2143            $as['AchievementStatus']['achievement_id'] = $achievementId;
2144            ClassRegistry::init('AchievementStatus')->create();
2145            ClassRegistry::init('AchievementStatus')->save($as);
2146            array_push($updated, $achievementId);
2147        }
2148        $achievementId = 115;
2149        if ($completed == '1000w2' && !isset($existingAs[$achievementId])) {
2150            $as['AchievementStatus']['achievement_id'] = $achievementId;
2151            ClassRegistry::init('AchievementStatus')->create();
2152            ClassRegistry::init('AchievementStatus')->save($as);
2153            array_push($updated, $achievementId);
2154        }
2155        $updatedCount = count($updated);
2156        for ($i = 0; $i < $updatedCount; $i++) {
2157            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
2158            $updated[$i] = [];
2159            $updated[$i][0] = $a['Achievement']['name'];
2160            $updated[$i][1] = $a['Achievement']['description'];
2161            $updated[$i][2] = $a['Achievement']['image'];
2162            $updated[$i][3] = $a['Achievement']['color'];
2163            $updated[$i][4] = $a['Achievement']['xp'];
2164            $updated[$i][5] = $a['Achievement']['id'];
2165        }
2166
2167        return $updated;
2168    }
2169
2170    protected function checkSetAchievements($sid = null) {
2171        $this->loadModel('Set');
2172        $this->loadModel('Tsumego');
2173        $this->loadModel('Achievement');
2174        $this->loadModel('AchievementStatus');
2175        $this->loadModel('AchievementCondition');
2176
2177        //$tNum = count($this->Tsumego->find('all', array('conditions' => array('set_id' => $sid))));
2178        $tNum = count(TsumegoUtil::collectTsumegosFromSet($sid));
2179        $s = $this->Set->findById($sid);
2180        $acA = ClassRegistry::init('AchievementCondition')->find('first', [
2181            'order' => 'value DESC',
2182            'conditions' => [
2183                'set_id' => $sid,
2184                'user_id' => Auth::getUserID(),
2185                'category' => '%',
2186            ],
2187        ]);
2188        if (!$acA) {
2189            return [];
2190        }
2191        $acS = ClassRegistry::init('AchievementCondition')->find('first', [
2192            'order' => 'value ASC',
2193            'conditions' => [
2194                'set_id' => $sid,
2195                'user_id' => Auth::getUserID(),
2196                'category' => 's',
2197            ],
2198        ]);
2199        $buffer = ClassRegistry::init('AchievementStatus')->find('all', ['conditions' => ['user_id' => Auth::getUserID()]]);
2200        if (!$buffer) {
2201            $buffer = [];
2202        }
2203        $existingAs = [];
2204        $bufferCount = count($buffer);
2205        for ($i = 0; $i < $bufferCount; $i++) {
2206            $existingAs[$buffer[$i]['AchievementStatus']['achievement_id']] = $buffer[$i];
2207        }
2208        $as = [];
2209        $as['AchievementStatus']['user_id'] = Auth::getUserID();
2210        $updated = [];
2211
2212        $achievementId = 99;
2213        if ($sid == -1 && !isset($existingAs[$achievementId])) {
2214            $as['AchievementStatus']['achievement_id'] = $achievementId;
2215            ClassRegistry::init('AchievementStatus')->create();
2216            ClassRegistry::init('AchievementStatus')->save($as);
2217            array_push($updated, $achievementId);
2218        }
2219        if ($tNum >= 100) {
2220            if ($s['Set']['difficulty'] < 1300) {
2221                $achievementId = 12;
2222                if ($acA['AchievementCondition']['value'] >= 75 && !isset($existingAs[$achievementId])) {
2223                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2224                    ClassRegistry::init('AchievementStatus')->create();
2225                    ClassRegistry::init('AchievementStatus')->save($as);
2226                    array_push($updated, $achievementId);
2227                }
2228                $achievementId = 13;
2229                if ($acA['AchievementCondition']['value'] >= 85 && !isset($existingAs[$achievementId])) {
2230                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2231                    ClassRegistry::init('AchievementStatus')->create();
2232                    ClassRegistry::init('AchievementStatus')->save($as);
2233                    array_push($updated, $achievementId);
2234                }
2235                $achievementId = 14;
2236                if ($acA['AchievementCondition']['value'] >= 95 && !isset($existingAs[$achievementId])) {
2237                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2238                    ClassRegistry::init('AchievementStatus')->create();
2239                    ClassRegistry::init('AchievementStatus')->save($as);
2240                    array_push($updated, $achievementId);
2241                }
2242                $achievementId = 24;
2243                if ($acS['AchievementCondition']['value'] < 15 && !isset($existingAs[$achievementId])) {
2244                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2245                    ClassRegistry::init('AchievementStatus')->create();
2246                    ClassRegistry::init('AchievementStatus')->save($as);
2247                    array_push($updated, $achievementId);
2248                }
2249                $achievementId = 25;
2250                if ($acS['AchievementCondition']['value'] < 10 && !isset($existingAs[$achievementId])) {
2251                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2252                    ClassRegistry::init('AchievementStatus')->create();
2253                    ClassRegistry::init('AchievementStatus')->save($as);
2254                    array_push($updated, $achievementId);
2255                }
2256                $achievementId = 26;
2257                if ($acS['AchievementCondition']['value'] < 5 && !isset($existingAs[$achievementId])) {
2258                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2259                    ClassRegistry::init('AchievementStatus')->create();
2260                    ClassRegistry::init('AchievementStatus')->save($as);
2261                    array_push($updated, $achievementId);
2262                }
2263            } elseif ($s['Set']['difficulty'] >= 1300 && $s['Set']['difficulty'] < 1500) {
2264                $achievementId = 15;
2265                if ($acA['AchievementCondition']['value'] >= 75 && !isset($existingAs[$achievementId])) {
2266                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2267                    ClassRegistry::init('AchievementStatus')->create();
2268                    ClassRegistry::init('AchievementStatus')->save($as);
2269                    array_push($updated, $achievementId);
2270                }
2271                $achievementId = 16;
2272                if ($acA['AchievementCondition']['value'] >= 85 && !isset($existingAs[$achievementId])) {
2273                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2274                    ClassRegistry::init('AchievementStatus')->create();
2275                    ClassRegistry::init('AchievementStatus')->save($as);
2276                    array_push($updated, $achievementId);
2277                }
2278                $achievementId = 17;
2279                if ($acA['AchievementCondition']['value'] >= 95 && !isset($existingAs[$achievementId])) {
2280                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2281                    ClassRegistry::init('AchievementStatus')->create();
2282                    ClassRegistry::init('AchievementStatus')->save($as);
2283                    array_push($updated, $achievementId);
2284                }
2285                $achievementId = 27;
2286                if ($acS['AchievementCondition']['value'] < 18 && !isset($existingAs[$achievementId])) {
2287                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2288                    ClassRegistry::init('AchievementStatus')->create();
2289                    ClassRegistry::init('AchievementStatus')->save($as);
2290                    array_push($updated, $achievementId);
2291                }
2292                $achievementId = 28;
2293                if ($acS['AchievementCondition']['value'] < 13 && !isset($existingAs[$achievementId])) {
2294                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2295                    ClassRegistry::init('AchievementStatus')->create();
2296                    ClassRegistry::init('AchievementStatus')->save($as);
2297                    array_push($updated, $achievementId);
2298                }
2299                $achievementId = 29;
2300                if ($acS['AchievementCondition']['value'] < 8 && !isset($existingAs[$achievementId])) {
2301                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2302                    ClassRegistry::init('AchievementStatus')->create();
2303                    ClassRegistry::init('AchievementStatus')->save($as);
2304                    array_push($updated, $achievementId);
2305                }
2306            } elseif ($s['Set']['difficulty'] >= 1500 && $s['Set']['difficulty'] < 1700) {
2307                $achievementId = 18;
2308                if ($acA['AchievementCondition']['value'] >= 75 && !isset($existingAs[$achievementId])) {
2309                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2310                    ClassRegistry::init('AchievementStatus')->create();
2311                    ClassRegistry::init('AchievementStatus')->save($as);
2312                    array_push($updated, $achievementId);
2313                }
2314                $achievementId = 19;
2315                if ($acA['AchievementCondition']['value'] >= 85 && !isset($existingAs[$achievementId])) {
2316                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2317                    ClassRegistry::init('AchievementStatus')->create();
2318                    ClassRegistry::init('AchievementStatus')->save($as);
2319                    array_push($updated, $achievementId);
2320                }
2321                $achievementId = 20;
2322                if ($acA['AchievementCondition']['value'] >= 95 && !isset($existingAs[$achievementId])) {
2323                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2324                    ClassRegistry::init('AchievementStatus')->create();
2325                    ClassRegistry::init('AchievementStatus')->save($as);
2326                    array_push($updated, $achievementId);
2327                }
2328                $achievementId = 30;
2329                if ($acS['AchievementCondition']['value'] < 30 && !isset($existingAs[$achievementId])) {
2330                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2331                    ClassRegistry::init('AchievementStatus')->create();
2332                    ClassRegistry::init('AchievementStatus')->save($as);
2333                    array_push($updated, $achievementId);
2334                }
2335                $achievementId = 31;
2336                if ($acS['AchievementCondition']['value'] < 20 && !isset($existingAs[$achievementId])) {
2337                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2338                    ClassRegistry::init('AchievementStatus')->create();
2339                    ClassRegistry::init('AchievementStatus')->save($as);
2340                    array_push($updated, $achievementId);
2341                }
2342                $achievementId = 32;
2343                if ($acS['AchievementCondition']['value'] < 10 && !isset($existingAs[$achievementId])) {
2344                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2345                    ClassRegistry::init('AchievementStatus')->create();
2346                    ClassRegistry::init('AchievementStatus')->save($as);
2347                    array_push($updated, $achievementId);
2348                }
2349            } else {
2350                $achievementId = 21;
2351                if ($acA['AchievementCondition']['value'] >= 75 && !isset($existingAs[$achievementId])) {
2352                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2353                    ClassRegistry::init('AchievementStatus')->create();
2354                    ClassRegistry::init('AchievementStatus')->save($as);
2355                    array_push($updated, $achievementId);
2356                }
2357                $achievementId = 22;
2358                if ($acA['AchievementCondition']['value'] >= 85 && !isset($existingAs[$achievementId])) {
2359                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2360                    ClassRegistry::init('AchievementStatus')->create();
2361                    ClassRegistry::init('AchievementStatus')->save($as);
2362                    array_push($updated, $achievementId);
2363                }
2364                $achievementId = 23;
2365                if ($acA['AchievementCondition']['value'] >= 95 && !isset($existingAs[$achievementId])) {
2366                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2367                    ClassRegistry::init('AchievementStatus')->create();
2368                    ClassRegistry::init('AchievementStatus')->save($as);
2369                    array_push($updated, $achievementId);
2370                }
2371                $achievementId = 33;
2372                if ($acS['AchievementCondition']['value'] < 30 && !isset($existingAs[$achievementId])) {
2373                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2374                    ClassRegistry::init('AchievementStatus')->create();
2375                    ClassRegistry::init('AchievementStatus')->save($as);
2376                    array_push($updated, $achievementId);
2377                }
2378                $achievementId = 34;
2379                if ($acS['AchievementCondition']['value'] < 20 && !isset($existingAs[$achievementId])) {
2380                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2381                    ClassRegistry::init('AchievementStatus')->create();
2382                    ClassRegistry::init('AchievementStatus')->save($as);
2383                    array_push($updated, $achievementId);
2384                }
2385                $achievementId = 35;
2386                if ($acS['AchievementCondition']['value'] < 10 && !isset($existingAs[$achievementId])) {
2387                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2388                    ClassRegistry::init('AchievementStatus')->create();
2389                    ClassRegistry::init('AchievementStatus')->save($as);
2390                    array_push($updated, $achievementId);
2391                }
2392            }
2393            $achievementId = 46;
2394            if ($acA['AchievementCondition']['value'] >= 100) {
2395                $ac100 = ClassRegistry::init('AchievementCondition')->find('all', ['conditions' => ['user_id' => Auth::getUserID(), 'category' => '%', 'value >=' => 100]]);
2396                if (!$ac100) {
2397                    $ac100 = [];
2398                }
2399                $ac100counter = 0;
2400                $ac100Count = count($ac100);
2401                for ($j = 0; $j < $ac100Count; $j++) {
2402                    if (count(TsumegoUtil::collectTsumegosFromSet($ac100[$j]['AchievementCondition']['set_id'])) >= 100) {
2403                        $ac100counter++;
2404                    }
2405                }
2406                $as100 = ClassRegistry::init('AchievementStatus')->find('first', ['conditions' => ['user_id' => Auth::getUserID(), 'achievement_id' => $achievementId]]);
2407                if ($as100 == null) {
2408                    $as['AchievementStatus']['achievement_id'] = $achievementId;
2409                    $as['AchievementStatus']['value'] = 1;
2410                    ClassRegistry::init('AchievementStatus')->create();
2411                    ClassRegistry::init('AchievementStatus')->save($as);
2412                    array_push($updated, $achievementId);
2413                } elseif ($as100['AchievementStatus']['value'] != $ac100counter) {
2414                    $as100['AchievementStatus']['value'] = $ac100counter;
2415                    ClassRegistry::init('AchievementStatus')->save($as100);
2416                    array_push($updated, $achievementId);
2417                }
2418            }
2419        }
2420        $updatedCount = count($updated);
2421        for ($i = 0; $i < $updatedCount; $i++) {
2422            $a = ClassRegistry::init('Achievement')->findById($updated[$i]);
2423            $updated[$i] = [];
2424            $updated[$i][0] = $a['Achievement']['name'];
2425            $updated[$i][1] = $a['Achievement']['description'];
2426            $updated[$i][2] = $a['Achievement']['image'];
2427            $updated[$i][3] = $a['Achievement']['color'];
2428            $updated[$i][4] = $a['Achievement']['xp'];
2429            $updated[$i][5] = $a['Achievement']['id'];
2430        }
2431
2432        return $updated;
2433    }
2434
2435    public static function updateXP($userID, $achievementData): void {
2436        $xpBonus = 0;
2437        $aCount = count($achievementData);
2438        for ($i = 0; $i < $aCount; $i++) {
2439            $xpBonus += $achievementData[$i][4];
2440        }
2441        if ($xpBonus == 0) {
2442            return;
2443        }
2444        $user = ClassRegistry::init('User')->findById($userID);
2445        $user['User']['xp'] = $xpBonus;
2446        Level::checkLevelUp($user['User']);
2447        ClassRegistry::init('User')->save($user);
2448    }
2449
2450    /**
2451     * @param int $uid User ID
2452     * @return void
2453     */
2454    protected function handleSearchSettings($uid) {
2455        $this->loadModel('UserContribution');
2456        $uc = $this->UserContribution->find('first', ['conditions' => ['user_id' => $uid]]);
2457        if ($uc == null) {
2458            $uc = [];
2459            $uc['UserContribution']['user_id'] = $uid;
2460            $uc['UserContribution']['added_tag'] = 0;
2461            $uc['UserContribution']['created_tag'] = 0;
2462            $uc['UserContribution']['made_proposal'] = 0;
2463            $uc['UserContribution']['reviewed'] = 0;
2464            $uc['UserContribution']['score'] = 0;
2465            $this->UserContribution->create();
2466            $this->UserContribution->save($uc);
2467        }
2468        new TsumegoFilters();
2469    }
2470
2471    protected function signIn(array $user): void {
2472        Auth::init($user);
2473        $vs = $this->TsumegoStatus->find('first', ['conditions' => ['user_id' => $user['User']['id']], 'order' => 'updated DESC']);
2474        if ($vs) {
2475            $this->Session->write('lastVisit', $vs['TsumegoStatus']['tsumego_id']);
2476        }
2477        $this->Session->write('texture', $user['User']['texture']);
2478        $this->Session->write('check1', $user['User']['id']);
2479    }
2480
2481    public function beforeFilter(): void {
2482        $this->loadModel('User');
2483        $this->loadModel('Activate');
2484        $this->loadModel('Tsumego');
2485        $this->loadModel('TsumegoRatingAttempt');
2486        $this->loadModel('Set');
2487        $this->loadModel('TimeModeAttempt');
2488        $this->loadModel('TsumegoStatus');
2489        $this->loadModel('Comment');
2490        $this->loadModel('TsumegoAttempt');
2491        $this->loadModel('AdminActivity');
2492        $this->loadModel('Achievement');
2493        $this->loadModel('AchievementStatus');
2494        $this->loadModel('AchievementCondition');
2495        $this->loadModel('SetConnection');
2496        $this->loadModel('Tag');
2497        $this->loadModel('TagName');
2498        $this->loadModel('Favorite');
2499
2500        Auth::init();
2501        $timeMode = new TimeMode();
2502
2503        $highscoreLink = 'highscore';
2504        $lightDark = 'light';
2505        $resetCookies = false;
2506        $levelBar = 1;
2507        $lastProfileLeft = 1;
2508        $lastProfileRight = 2;
2509        $hasFavs = false;
2510
2511        if (Auth::isLoggedIn()) {
2512            if (isset($_COOKIE['addTag']) && $_COOKIE['addTag'] != 0 && $this->Session->read('page') != 'set') {
2513                $newAddTag = explode('-', $_COOKIE['addTag']);
2514                $tagId = $newAddTag[0];
2515                $newTagName = $this->TagName->find('first', ['conditions' => ['name' => str_replace($tagId . '-', '', $_COOKIE['addTag'])]]);
2516                if ($newTagName) {
2517                    $saveTag = [];
2518                    $saveTag['Tag']['tag_name_id'] = $newTagName['TagName']['id'];
2519                    $saveTag['Tag']['tsumego_id'] = $tagId;
2520                    $saveTag['Tag']['user_id'] = Auth::getUserID();
2521                    $saveTag['Tag']['approved'] = 0;
2522                    $this->Tag->save($saveTag);
2523                }
2524                $this->set('removeCookie', 'addTag');
2525            }
2526            if (isset($_COOKIE['z_sess']) && $_COOKIE['z_sess'] != 0
2527            && strlen($_COOKIE['z_sess']) > 5) {
2528                Auth::getUser()['_sessid'] = $_COOKIE['z_sess'];
2529                Auth::saveUser();
2530            }
2531            if (Auth::getUser()['lastHighscore'] == 1) {
2532                $highscoreLink = 'highscore';
2533            } elseif (Auth::getUser()['lastHighscore'] == 2) {
2534                $highscoreLink = 'rating';
2535            } elseif (Auth::getUser()['lastHighscore'] == 3) {
2536                $highscoreLink = 'leaderboard';
2537            } elseif (Auth::getUser()['lastHighscore'] == 4) {
2538                $highscoreLink = 'highscore3';
2539            }
2540
2541            if (isset($_COOKIE['lastMode']) && $_COOKIE['lastMode'] != 0) {
2542                Auth::getUser()['lastMode'] = $_COOKIE['lastMode'];
2543                Auth::saveUser();
2544            }
2545            if (isset($_COOKIE['sound']) && $_COOKIE['sound'] != '0') {
2546                Auth::getUser()['sound'] = $_COOKIE['sound'];
2547                Auth::saveUser();
2548                unset($_COOKIE['sound']);
2549            }
2550            $this->set('ac', true);
2551            $this->set('user', Auth::getUser());
2552        }
2553
2554        if (isset($_COOKIE['lightDark']) && $_COOKIE['lightDark'] != '0') {
2555            $lightDark = $_COOKIE['lightDark'];
2556            if (Auth::isLoggedIn()) {
2557                // Convert string to integer for database storage
2558                $lightDarkInt = ($lightDark === 'light') ? 0 : 2;
2559                Auth::getUser()['lastLight'] = $lightDarkInt;
2560            }
2561        } elseif (Auth::isLoggedIn()) {
2562            if (Auth::getUser()['lastLight'] == 0
2563            || Auth::getUser()['lastLight'] == 1) {
2564                $lightDark = 'light';
2565            } else {
2566                $lightDark = 'dark';
2567            }
2568        }
2569
2570        if (Auth::isLoggedIn()) {
2571            $this->handleSearchSettings(Auth::getUserID());
2572            if (isset($_COOKIE['levelBar']) && $_COOKIE['levelBar'] != '0') {
2573                $levelBar = $_COOKIE['levelBar'];
2574                Auth::getUser()['levelBar'] = $levelBar;
2575            } elseif (Auth::getUser()['levelBar'] == 0
2576          || Auth::getUser()['levelBar'] == 'level') {
2577                $levelBar = 1;
2578            } else {
2579                $levelBar = 2;
2580            }
2581
2582            if (isset($_COOKIE['lastProfileLeft']) && $_COOKIE['lastProfileLeft'] != '0') {
2583                $lastProfileLeft = $_COOKIE['lastProfileLeft'];
2584                Auth::getUser()['lastProfileLeft'] = $lastProfileLeft;
2585            } else {
2586                $lastProfileLeft = Auth::getUser()['lastProfileLeft'];
2587                if ($lastProfileLeft == 0) {
2588                    $lastProfileLeft = 1;
2589                }
2590            }
2591            if (isset($_COOKIE['lastProfileRight']) && $_COOKIE['lastProfileRight'] != '0') {
2592                $lastProfileRight = $_COOKIE['lastProfileRight'];
2593                Auth::getUser()['lastProfileRight'] = $lastProfileRight;
2594            } else {
2595                $lastProfileRight = Auth::getUser()['lastProfileRight'];
2596                if ($lastProfileRight == 0) {
2597                    $lastProfileRight = 1;
2598                }
2599            }
2600        }
2601        $mode = 1;
2602        if (isset($_COOKIE['mode']) && $_COOKIE['mode'] != '0') {
2603            if ($_COOKIE['mode'] == 1) {
2604                $mode = 1;
2605            } else {
2606                $mode = 2;
2607            }
2608        }
2609
2610        if (Auth::isLoggedIn() && Auth::getUser()['mode'] == 2) {
2611            $mode = 2;
2612        }
2613
2614        if ($_COOKIE['sprint'] != 1) {
2615            $this->updateSprintCondition();
2616        }
2617
2618        if (Auth::isLoggedIn()) {
2619            if (isset($_COOKIE['revelation']) && $_COOKIE['revelation'] != 0) {
2620                Auth::getUser()['revelation'] -= 1;
2621            }
2622
2623            if (!$this->request->is('ajax')) {
2624                $this->PlayResultProcessor->checkPreviousPlay($timeMode);
2625            }
2626        }
2627        $boardNames = [];
2628        $enabledBoards = [];
2629        $boardPositions = [];
2630
2631        $boardNames[1] = 'Pine';
2632        $boardNames[2] = 'Ash';
2633        $boardNames[3] = 'Maple';
2634        $boardNames[4] = 'Shin Kaya';
2635        $boardNames[5] = 'Birch';
2636        $boardNames[6] = 'Wenge';
2637        $boardNames[7] = 'Walnut';
2638        $boardNames[8] = 'Mahogany';
2639        $boardNames[9] = 'Blackwood';
2640        $boardNames[10] = 'Marble 1';
2641        $boardNames[11] = 'Marble 2';
2642        $boardNames[12] = 'Marble 3';
2643        $boardNames[13] = 'Tibet Spruce';
2644        $boardNames[14] = 'Marble 4';
2645        $boardNames[15] = 'Marble 5';
2646        $boardNames[16] = 'Quarry 1';
2647        $boardNames[17] = 'Flowers';
2648        $boardNames[18] = 'Nova';
2649        $boardNames[19] = 'Spring';
2650        $boardNames[20] = 'Moon';
2651        $boardNames[21] = 'Apex';
2652        $boardNames[22] = 'Gold 1';
2653        $boardNames[23] = 'Amber';
2654        $boardNames[24] = 'Marble 6';
2655        $boardNames[25] = 'Marble 7';
2656        $boardNames[26] = 'Marble 8';
2657        $boardNames[27] = 'Marble 9';
2658        $boardNames[28] = 'Marble 10';
2659        $boardNames[29] = 'Jade';
2660        $boardNames[30] = 'Quarry 2';
2661        $boardNames[31] = 'Black Bricks';
2662        $boardNames[32] = 'Wallpaper 1';
2663        $boardNames[33] = 'Wallpaper 2';
2664        $boardNames[34] = 'Gold & Gray';
2665        $boardNames[35] = 'Gold & Pink';
2666        $boardNames[36] = 'Veil';
2667        $boardNames[37] = 'Tiles';
2668        $boardNames[38] = 'Mars';
2669        $boardNames[39] = 'Pink Cloud';
2670        $boardNames[40] = 'Reptile';
2671        $boardNames[41] = 'Mezmerizing';
2672        $boardNames[42] = 'Magenta Sky';
2673        $boardNames[43] = 'Tsumego Hero';
2674        $boardNames[44] = 'Pretty';
2675        $boardNames[45] = 'Hunting';
2676        $boardNames[46] = 'Haunted';
2677        $boardNames[47] = 'Carnage';
2678        $boardNames[48] = 'Blind Spot';
2679        $boardNames[49] = 'Giants';
2680        $boardNames[50] = 'Gems';
2681        $boardNames[51] = 'Grandmaster';
2682        $boardPositions[1] = [1, 'texture1', 'black34.png', 'white34.png'];
2683        $boardPositions[2] = [2, 'texture2', 'black34.png', 'white34.png'];
2684        $boardPositions[3] = [3, 'texture3', 'black34.png', 'white34.png'];
2685        $boardPositions[4] = [4, 'texture4', 'black.png', 'white.png'];
2686        $boardPositions[5] = [5, 'texture5', 'black34.png', 'white34.png'];
2687        $boardPositions[6] = [6, 'texture6', 'black.png', 'white.png'];
2688        $boardPositions[7] = [7, 'texture7', 'black34.png', 'white34.png'];
2689        $boardPositions[8] = [8, 'texture8', 'black.png', 'white.png'];
2690        $boardPositions[9] = [9, 'texture9', 'black.png', 'white.png'];
2691        $boardPositions[10] = [10, 'texture10', 'black34.png', 'white34.png'];
2692        $boardPositions[11] = [11, 'texture11', 'black34.png', 'white34.png'];
2693        $boardPositions[12] = [12, 'texture12', 'black34.png', 'white34.png'];
2694        $boardPositions[13] = [13, 'texture13', 'black34.png', 'white34.png'];
2695        $boardPositions[14] = [14, 'texture14', 'black34.png', 'white34.png'];
2696        $boardPositions[15] = [15, 'texture15', 'black.png', 'white.png'];
2697        $boardPositions[16] = [16, 'texture16', 'black34.png', 'white34.png'];
2698        $boardPositions[17] = [17, 'texture17', 'black34.png', 'white34.png'];
2699        $boardPositions[18] = [18, 'texture18', 'black.png', 'white.png'];
2700        $boardPositions[19] = [19, 'texture19', 'black34.png', 'white34.png'];
2701        $boardPositions[20] = [20, 'texture20', 'black34.png', 'white34.png'];
2702        $boardPositions[21] = [33, 'texture33', 'black34.png', 'white34.png'];
2703        $boardPositions[22] = [21, 'texture21', 'black.png', 'whiteKo.png'];
2704        $boardPositions[23] = [22, 'texture22', 'black34.png', 'white34.png'];
2705        $boardPositions[24] = [34, 'texture34', 'black.png', 'white.png'];
2706        $boardPositions[25] = [35, 'texture35', 'black34.png', 'white34.png'];
2707        $boardPositions[26] = [36, 'texture36', 'black.png', 'white.png'];
2708        $boardPositions[27] = [37, 'texture37', 'black34.png', 'white34.png'];
2709        $boardPositions[28] = [38, 'texture38', 'black38.png', 'white34.png'];
2710        $boardPositions[29] = [39, 'texture39', 'black.png', 'white.png'];
2711        $boardPositions[30] = [40, 'texture40', 'black34.png', 'white34.png'];
2712        $boardPositions[31] = [41, 'texture41', 'black34.png', 'white34.png'];
2713        $boardPositions[32] = [42, 'texture42', 'black34.png', 'white42.png'];
2714        $boardPositions[33] = [43, 'texture43', 'black34.png', 'white42.png'];
2715        $boardPositions[34] = [44, 'texture44', 'black34.png', 'white34.png'];
2716        $boardPositions[35] = [45, 'texture45', 'black34.png', 'white42.png'];
2717        $boardPositions[36] = [47, 'texture47', 'black34.png', 'white34.png'];
2718        $boardPositions[37] = [48, 'texture48', 'black34.png', 'white34.png'];
2719        $boardPositions[38] = [49, 'texture49', 'black.png', 'white.png'];
2720        $boardPositions[39] = [50, 'texture50', 'black34.png', 'white34.png'];
2721        $boardPositions[40] = [51, 'texture51', 'black34.png', 'white34.png'];
2722        $boardPositions[41] = [52, 'texture52', 'black34.png', 'white34.png'];
2723        $boardPositions[42] = [53, 'texture53', 'black34.png', 'white34.png'];
2724        $boardPositions[43] = [54, 'texture54', 'black54.png', 'white54.png'];
2725        $boardPositions[44] = [23, 'texture23', 'black.png', 'whiteFlower.png'];
2726        $boardPositions[45] = [24, 'texture24', 'black24.png', 'white24.png'];
2727        $boardPositions[46] = [25, 'texture25', 'blackGhost.png', 'white.png'];
2728        $boardPositions[47] = [26, 'texture26', 'blackInvis.png', 'whiteCarnage.png'];
2729        $boardPositions[48] = [27, 'texture27', 'black27.png', 'white27.png'];
2730        $boardPositions[49] = [28, 'texture28', 'blackGiant.png', 'whiteKo.png'];
2731        $boardPositions[50] = [29, 'texture29', 'blackKo.png', 'whiteKo.png'];
2732        $boardPositions[51] = [30, 'texture55', 'blackGalaxy.png', 'whiteGalaxy.png'];
2733
2734        $boardCount = 51;
2735
2736        if ($this->Session->check('texture') || (isset($_COOKIE['texture']) && $_COOKIE['texture'] != '0')) {
2737            $splitCookie = [];
2738            if (isset($_COOKIE['texture']) && $_COOKIE['texture'] != '0') {
2739                $splitCookie = str_split($_COOKIE['texture']);
2740                $textureCookies = $_COOKIE['texture'];
2741                Auth::getUser()['texture'] = $this->Session->read('texture');
2742                $this->Session->write('texture', $_COOKIE['texture']);
2743                $this->set('textureCookies', $textureCookies);
2744            } else {
2745                if (Auth::isLoggedIn()) {
2746                    $this->Session->write('texture', Auth::getUser()['texture']);
2747                }
2748                $textureCookies = $this->Session->read('texture');
2749                $splitTextureCookies = str_split($textureCookies);
2750                $splitTextureCookiesCount = count($splitTextureCookies);
2751                for ($i = 0; $i < $splitTextureCookiesCount; $i++) {
2752                    if ($splitTextureCookies[$i] == 2) {
2753                        $enabledBoards[$i + 1] = 'checked';
2754                    } else {
2755                        $enabledBoards[$i + 1] = '';
2756                    }
2757                }
2758            }
2759
2760            $splitCookieCount = count($splitCookie);
2761            for ($i = 0; $i < $splitCookieCount; $i++) {
2762                if ($splitCookie[$i] == 2) {
2763                    $enabledBoards[$i + 1] = 'checked';
2764                } else {
2765                    $enabledBoards[$i + 1] = '';
2766                }
2767            }
2768            if (Auth::isLoggedIn()) {
2769                Auth::saveUser();
2770            }
2771        }
2772
2773        if (!$this->Session->check('texture')) {
2774            $this->Session->write('texture', '222222221111111111111111111111111111111111111111111');
2775            $enabledBoards[1] = 'checked';
2776            $enabledBoards[2] = 'checked';
2777            $enabledBoards[3] = 'checked';
2778            $enabledBoards[4] = 'checked';
2779            $enabledBoards[5] = 'checked';
2780            $enabledBoards[6] = 'checked';
2781            $enabledBoards[7] = 'checked';
2782            $enabledBoards[8] = 'checked';
2783            $enabledBoards[9] = '';
2784            $enabledBoards[10] = '';
2785            $enabledBoards[11] = '';
2786            $enabledBoards[12] = '';
2787            $enabledBoards[13] = '';
2788            $enabledBoards[14] = '';
2789            $enabledBoards[15] = '';
2790            $enabledBoards[16] = '';
2791            $enabledBoards[17] = '';
2792            $enabledBoards[18] = '';
2793            $enabledBoards[19] = '';
2794            $enabledBoards[20] = '';
2795            $enabledBoards[21] = '';
2796            $enabledBoards[22] = '';
2797            $enabledBoards[23] = '';
2798            $enabledBoards[24] = '';
2799            $enabledBoards[25] = '';
2800            $enabledBoards[26] = '';
2801            $enabledBoards[27] = '';
2802            $enabledBoards[28] = '';
2803            $enabledBoards[29] = '';
2804            $enabledBoards[30] = '';
2805            $enabledBoards[31] = '';
2806            $enabledBoards[32] = '';
2807            $enabledBoards[33] = '';
2808            $enabledBoards[34] = '';
2809            $enabledBoards[35] = '';
2810            $enabledBoards[36] = '';
2811            $enabledBoards[37] = '';
2812            $enabledBoards[38] = '';
2813            $enabledBoards[39] = '';
2814            $enabledBoards[40] = '';
2815            $enabledBoards[41] = '';
2816            $enabledBoards[42] = '';
2817            $enabledBoards[43] = '';
2818            $enabledBoards[44] = '';
2819            $enabledBoards[45] = '';
2820            $enabledBoards[46] = '';
2821            $enabledBoards[47] = '';
2822            $enabledBoards[48] = '';
2823            $enabledBoards[49] = '';
2824            $enabledBoards[50] = '';
2825            $enabledBoards[51] = '';
2826        }
2827        $achievementUpdate = [];
2828        if ($this->Session->check('initialLoading')) {
2829            $achievementUpdate1 = $this->checkLevelAchievements();
2830            $achievementUpdate2 = $this->checkProblemNumberAchievements();
2831            $achievementUpdate3 = $this->checkRatingAchievements();
2832            $achievementUpdate4 = $this->checkTimeModeAchievements();
2833            $achievementUpdate5 = $this->checkDanSolveAchievements();
2834            $achievementUpdate = array_merge(
2835                $achievementUpdate1 ?: [],
2836                $achievementUpdate2 ?: [],
2837                $achievementUpdate3 ?: [],
2838                $achievementUpdate4 ?: [],
2839                $achievementUpdate5 ?: []
2840            );
2841            $this->Session->delete('initialLoading');
2842        }
2843
2844        if (count($achievementUpdate) > 0) {
2845            $this->updateXP(Auth::getUserID(), $achievementUpdate);
2846        }
2847
2848        $nextDay = new DateTime('tomorrow');
2849        if (Auth::isLoggedIn()) {
2850            Auth::getUser()['name'] = $this->checkPicture(Auth::getUser());
2851            $this->set('user', Auth::getUser());
2852        }
2853        $this->set('mode', $mode);
2854        $this->set('nextDay', $nextDay->format('m/d/Y'));
2855        $this->set('boardNames', $boardNames);
2856        $this->set('enabledBoards', $enabledBoards);
2857        $this->set('boardPositions', $boardPositions);
2858        $this->set('highscoreLink', $highscoreLink);
2859        $this->set('achievementUpdate', $achievementUpdate);
2860        $this->set('lightDark', $lightDark);
2861        $this->set('levelBar', $levelBar);
2862        $this->set('lastProfileLeft', $lastProfileLeft);
2863        $this->set('lastProfileRight', $lastProfileRight);
2864        $this->set('resetCookies', $resetCookies);
2865        $this->set('hasFavs', $hasFavs);
2866    }
2867
2868    public function afterFilter() {}
2869}